【问题标题】:How to store creation date in a new table?如何将创建日期存储在新表中?
【发布时间】:2014-07-19 14:40:30
【问题描述】:

我正在构建一个数据库,该数据库将有关员工的信息存储在一个名为employees 的表中,并且我想将日志信息存储在另一个名为log info 的表中。 日志信息应包含创建者的姓名、创建和修改日期。

我应该使用什么值以及如何使创建日期不可更改?

因为我不想将它存储在员工表中,有没有办法在员工表上创建条目时自动更改另一个表上的日期和时间。 这只能通过代码来完成,还是只能通过 SQL 语句来完成?

这是数据库规范。我应该如何拆分数据?

主要数据:

  • 姓名
  • 生日
  • 身份证
  • 是员工
  • 联系信息(电子邮件、电话、地址)

以下英文、西班牙文和法文信息:

  • 简介
  • 工作经历
  • 教育信息

日志信息:

  • 创建条目的人员和时间
  • 上次修改数据的人员和时间

【问题讨论】:

  • 这是一个关于到底如何使用 SQL 的非常笼统的问题。答案可以在文档中找到。一般来说,您不能真正使条目严格意义上只写,这与关系数据库的想法背道而驰。相反,您必须在应用程序级别保留此类权限。您可以使用triggers 自动在日志表中创建条目。但在这种情况下,也许编写一个手动条目就足够了。
  • 一般来说什么更好?通过代码或通过 SQL。有谁知道它是如何通过SQL和phpmyadmin完成的吗?
  • 我为员工创建了一个表,为每种语言的信息创建了 3 个表和一个日志信息表。我应该将日志信息放在员工表中还是将其保留为单独的表?
  • 我更新了我的问题,你能帮忙解决我应该如何拆分数据吗?

标签: mysql sql database phpmyadmin


【解决方案1】:

您将列声明为timestampdatetime 并对其进行初始化。这是一个例子:

CREATE TABLE t1 (
  dt DATETIME DEFAULT CURRENT_TIMESTAMP CURRENT_TIMESTAMP
);

MySQL 文档对如何做到这一点有很长的解释 here

编辑:

我认为您确实应该将创建日期存储在存储数据的同一个表中。这似乎合乎逻辑,这就是我设计所有表的基本方式。

如果你真的想把它放在另一个表中,那么你可以使用insert 触发器在每次在第一个表中插入一行时在另一个表中插入一行。作为说明,我从未使用过这种方法。我总是将此类创建日期与数据一起放在表格中。

【讨论】:

  • 那么,如果我将一个字段设置为 date_created 作为 DEFAULT CURRENT_TIMESTAMP CURRENT_TIMESTAMP 这个值不会在每次修改条目时都改变?
  • @Andreas777 。 . .不,一旦设置,它就设置好了。几乎所有默认值都是如此。更新除外。如果您想要更新时间,请在定义中使用on update 子句。
  • 谢谢戈登。我是数据库设计的新手,这让我很困惑。这是我必须创建一个关于员工的数据库并存储一些信息以及存储创建日期和修改日期的项目。你知道我是否可以通过 phpmyadmin 或仅通过代码来完成?
  • 您将这些行放在create table 语句中。它们在数据库中,它们只是工作。在创建表的时候,我也经常把创建表的用户放在一个列中。在 MySQL 中,我认为您可以使用 current_user()
  • “因为我不想将它存储在员工表中”->此解决方案使用同一个表来记录创建日期
【解决方案2】:

您可以使用mysql triggers 例如创建日志表如下:

CREATE TABLE `log_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `entry_time` TIMESTAMP NOT NULL,
  `emp_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;

假设您的 employees 表有一个 employee_name 列和一个 id 主键,您可以在其上创建一个触发器,在插入名称后自动执行:

delimiter |

CREATE TRIGGER loginsert AFTER INSERT ON employee_name
  FOR EACH ROW
  BEGIN
    INSERT INTO log_info SET emp_id=NEW.id, entry_time= NOW();
  END;
|

这将允许您使用不同的表来记录日志内容,您还可以将更多数据插入到 log_info 表中,例如插入的员工的键、插入记录的人等...只需检查文档中的所有语法。

【讨论】:

  • 那么,我可以在另一个表上使用这个触发器还是必须在同一个表上?
  • 是的,我已经编辑了答案以添加 log_info 表的示例。触发器被添加到它监听更改的表中(员工),但它可以在数据库中的任何表上工作,包括雇员表。它也不限于一次在一张桌子上工作
  • 非常感谢。我考虑使用employees表中的emp_id作为log_info表中的主键,因为每个log_info条目都应该属于具有相同id的员工。我应该这样做还是按照您的建议使用另一个字段作为 id?
  • 是的,我没想到。另一方面,这是一个限制,你不知道它将来会如何限制你,以防万一。
  • 不只是在使用 log_info 表时说,例如,您可能希望重用该表来记录另一个表上的操作,而不是员工。但是,如果您仅将其用于员工日志记录,那没关系
猜你喜欢
  • 2018-06-22
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 2013-03-11
  • 2019-12-16
相关资源
最近更新 更多