Php 在表中使用datetime列作为外键安全吗?

Php 在表中使用datetime列作为外键安全吗?,php,mysql,sql-server,database,Php,Mysql,Sql Server,Database,我有两张桌子。表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生成),我不能使用服务器端编

我有两张桌子。表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_是用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)获取自动增量值是不可靠的。因为用户可以删除一条记录并打乱订单
  • 我更改表结构的权限有限。小改动是可以的,但大改动是禁止的
  • 我的计划安全吗,还是有其他选择

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

因此,当您想在表a中创建新条目时,只需获取
序号的
,并将其递增1即可

同样在表B中,将
序列号
设置为外键,如下所示:

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

以下是您对表DDL(模式)的要求:

表B将有一个外键引用到表a


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

表B应该有另一列,该列是表A的外键引用,如果您希望这样关联数据的话。我不会将日期时间用作外键引用。对您的团队来说,什么是主要的更改?设置外键和更改表上的索引只是一个小更改?在您的设计中,表B中是否有多行具有相同的日期时间?还有,不要收到你的第一张纸条。删除会弄乱什么顺序?@Alfabravo no.只有一个日期时间(date_created)和几个包含字符串/文本的列。@srayhunter根据我的表结构有什么建议吗?处理并发时使用max()是不安全的。如果OP担心排序问题,这将无法正常工作,我将在表中使用排序。但是,这似乎值得一试。嗯。。我不知道。似乎有很多变化。表A早于表B创建。添加一列或两列是可以的。恐怕有些反常现象。顺便提一下,很好的建议。@ashura91这里最重要的一点是,您可以为已经创建的表创建一个外键。如果已经创建了表B,则只需将另一列添加到表B中。在创建引用之前,可以将行设置为null。
seq_no | images
  1    |  abc.jpg
  3    |  efg.jpg
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
);