【发布时间】:2017-10-21 05:46:42
【问题描述】:
我正在使用 MySQL Workbench 的 EER 工具为我正在开发的应用程序进行数据库设计。跟踪数据库上的数据更改非常重要,所以我关注了this 的帖子,这对接受的答案很有意义。我遇到的问题是我不太了解主键,所以我对这应该如何工作有点困惑,因为每次进行更改时都会插入具有相同 ID 的另一行,因此数据库不允许我是对的吗?由于外键,我需要使用主键。
【问题讨论】:
-
您引用的答案使用复合PK,只要valid_from和/或valid_until不同,客户ID就可以重复;这样的 PK 使用其所有字段的组合来表示身份。 (我看到的答案细节的一个问题是它指的是使用触发器,但触发器不能修改它们“打开”的表)。我赞成一种涉及“历史”表的解决方案,该表由“当前”表上的触发器更新和填充。
-
@Uueerdo 哦,我明白了,但是将 valid_until 作为主键是错误的,因为这可能是空的?我观察到的另一件事是 EER 正在将主键作为引用外键的列,这是最佳做法吗?
-
NULL 值可以是主键和唯一索引的一部分;但行为略有不同(任何两个 NULL 彼此“唯一”。)这个答案可能只需要一个 (id, from) PK; (id, from, to) 不会阻止像 (0,1,4) 和 (0,2,5) 这样的数据同时存在,当您在寻找“when 3 between from and to”时会导致问题。
-
@Uueerdo "PRIMARY KEY - 一个唯一索引,其中所有键列都必须定义为 NOT NULL。" dev.mysql.com/doc/refman/5.7/en/create-table.html
-
啊,是的,很好。我忘记了主键和唯一键之间的区别;因为除非特别合适,否则我会避免在唯一键中使用空值,因此我将它们混为一谈。
标签: mysql sql foreign-keys primary-key