添加引用不是主键或唯一键的列的外键

Jav*_*aSa 2 mysql database-design

当我想将表 A 的列的值限制为仅从表 B 的相关列中的一组可选值中获取时,我遇到了麻烦。

问题是表 B 的相关列不是外键。如果我这样做,我想我可以为不同的列值多次使用相同值的正确状态将是不可能的 - 这不是我寻找的行为。

那么可以做什么呢?

Dav*_*ett 5

所以table2.columnB必须包含一个值 fromtable1.columnA 可能有重复的值,table1.columnA所以你不能声明它是唯一的?显然 InnoDB 确实允许这样做,请参阅/sf/ask/165351441/进行讨论,但标准 SQL(因此大多数数据库)明确没有(它呈现一些操作,比如ON {DELETE|UPDATE} CASCADE可能不一致),所以我会避免这个选项。

如果没有有效的值的一组固定的,你可以让他们在自己的表在列定义的唯一/主键,那么这两个table2.columnBtable1.columnA可外键引用新TABLE.COLUMN。

一个不太干净的选择是编写触发器来手动维护外键,如http://cvuorinen.net/2013/05/validating-data-with-triggers-in-mysql/中提到的,你应该很容易找到通过您首选的搜索引擎。您需要小心地以逻辑和有效的方式考虑所有可能性,因此我会推荐“新实体类型和外键”方法 - 这将不太容易出错,可能更有效,并且无论如何可能会更好地对您的数据进行建模(也许这些列表示的属性本身应该是实体)。

  • 对,就是这样。引用非 PRIMARY 或 UNIQUE 列是一个坏主意。即使 MySQL 允许它,它也不应该被信任。 (2认同)