使用外键维护非主键列的参照完整性
在数据库系统中,外键用于建立表之间的关系并强制执行参照完整性。通常,外键引用其他表中的主键,以确保从属表中的数据一致。但是,在某些情况下,可能需要创建指向非主键列的外键。
让我们考虑问题中描述的场景,其中一个表 (table2) 需要与另一个表 (table1) 保持参照完整性,但 table1 中引用的列不是主键。提供的示例 SQL 代码演示了表和尝试创建的外键定义:
<code class="language-sql">CREATE TABLE table1 ( ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, AnotherID INT NOT NULL, SomeData VARCHAR(100) NOT NULL ) CREATE TABLE table2 ( ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, AnotherID INT NOT NULL, MoreData VARCHAR(30) NOT NULL, CONSTRAINT fk_table2_table1 FOREIGN KEY (AnotherID) REFERENCES table1 (AnotherID) )</code>
问题在于 table1 中的 AnotherID 列不是主键。在大多数数据库系统中,外键只能引用主键或具有唯一约束的列。
要解决此问题,必须确保引用的列 (table1 中的 AnotherID) 定义了唯一约束。唯一约束在每行基础上强制执行,确保该列中的值在表的所有行中都是唯一的。
通过在 table1 中的 AnotherID 上添加唯一约束,它就成为外键引用的候选对象。以下修改后的 SQL 代码演示了此更正:
<code class="language-sql">ALTER TABLE table1 ADD UNIQUE (AnotherID)</code>
现在,可以成功定义 table2 中的外键约束,从而强制执行两个表之间的参照完整性。
<code class="language-sql">ALTER TABLE table2 ADD CONSTRAINT FK_Table2_Table1 FOREIGN KEY (AnotherID) REFERENCES table1 (AnotherID)</code>
但是,正如对原始问题的答案所指出的那样,通常建议使用主键作为候选键。主键会自动定义为唯一,无需额外的约束,并简化外键定义。
以上是如何创建引用非主键列的外键约束?的详细内容。更多信息请关注PHP中文网其他相关文章!