【问题标题】:Is it safe to have a datetime column as foreign key in a table?将日期时间列作为表中的外键是否安全?
【发布时间】:2017-02-20 03:29:11
【问题描述】:

我有两张桌子。表 A 和 B。表 A 有一列以自增为主键。

id    name       date_created
1     Kletian    12-12-12 12:12:12  
2     Vormav     12-12-12 12:12:13
3     Agrias     12-12-12 12:12:14
4     Ramza      12-12-12 12:12:15

表 B 应该有一个引用表 A 中 id 的外键。但是由于 id 是自动递增的(由 mysql 生成),我无法使用服务器端编程来分配它(我使用 PHP 插入)。但是,在表 A 中,有一列 date_created 带有 datetime 属性。

通常情况下,表 B 应如下所示:

id     images
1      abc.jpg
1      def.png
1      ghi.jpg
2      jkl.png
3      mno.jpeg
3      pqr.png

这是我对 B 桌的计划:

date_created           images
12-12-12 12:12:12      abc.jpg
12-12-12 12:12:12      def.png
12-12-12 12:12:12 
12-12-12 12:12:13
12-12-12 12:12:14       
12-12-12 12:12:14      pqr.png

注意:

  • 通过服务器端编程 (PHP) 获取自动增量值并不可靠。由于用户可以删除记录并弄乱订单。
  • 我更改表结构的权限有限。小改动是可以的,但大改动是禁止的。
  • 我的计划安全还是有其他选择?

【问题讨论】:

  • 表 B 应该有另一列是对表 A 的外键引用,如果这是您想要关联数据的方式。我不会使用日期时间作为外键引用。
  • 您的团队有什么重大变化?设置外键并更改表上的索引是一个小改动?在您的设计中,表 B 中是否会有多行具有相同的日期时间?另外,不要得到你的第一个笔记。删除搞乱了什么顺序?
  • @Alfabravo 没有。只有一个日期时间(date_created)和几列将包含字符串/文本。
  • @srayhunter 根据我的表结构对我有什么建议吗?

标签: php mysql sql-server database


【解决方案1】:

序列号:在表 A 中取一列,在插入新条目时递增(不是自动递增)例如:

seq_no | name 
  1    |  Kletian
  3    |  Agrias

因此,当您想在表 A 中输入新条目时,只需获取 seq_noMAX() 并将其递增1.

同样在表 B 中,将 seq_no 设为外键,如下:

seq_no | images
  1    |  abc.jpg
  3    |  efg.jpg

【讨论】:

  • 在处理并发时使用 max() 是不安全的。如果 OP 担心订购,这将不起作用
  • 好吧,我将在表格中使用排序。但是,似乎值得一试。
【解决方案2】:

这是您想要的表 DDL(架构):

CREATE TABLE IF NOT EXISTS `table_a` (
  `id`                  MEDIUMINT   NOT NULL AUTO_INCREMENT,
  `name`                TEXT        NOT NULL,
  `created_date`        TIMESTAMP   NOT NULL DEFAULT NOW(),
  PRIMARY KEY (`id`)
);

CREATE TABLE IF NOT EXISTS `table_b` (
  `id`                  MEDIUMINT   NOT NULL AUTO_INCREMENT,
  `image`               TINYTEXT    NOT NULL,
  `created_date`        TIMESTAMP   NOT NULL DEFAULT NOW(),
  `table_a_id`          MEDIUMINT   NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (`table_a_id`) REFERENCES table_a(id) ON DELETE CASCADE
);

表 B 将具有对 表 A 的外键引用。

我不确定是否能够进行这些更改,但那将是理想的解决方案。

【讨论】:

  • 嗯..我不知道。似乎有很多变化。表 A 是在表 B 之前创建的。添加一或两列是可以的。恐怕有异常。顺便说一句,很棒的建议。
  • @ashura91这里最重要的是您可以为已创建的表创建外键。如果表 B 已经创建,您只需向表 B 添加另一列。在创建引用之前,您可以将行设置为空。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 2017-05-14
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 2020-10-18
  • 2018-06-14
相关资源
最近更新 更多