外键约束中引用非主键
通过外键链接表时维护引用完整性是一个常见需求。但是,当外键引用的表没有与被引用列对应的主键时,就会出现这种情况。
问题描述:
考虑以下数据库模式:
<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>
这里的目标是在 table2.AnotherID 和 table1.AnotherID 之间强制执行外键约束。但是,ID 是 table1 的主键,而 AnotherID 不是主键。
解决方案:
要创建引用非主键的外键约束,被引用列必须应用唯一约束。根据 Microsoft 的 Books Online:
“FOREIGN KEY 约束不必只链接到另一个表中的 PRIMARY KEY 约束;它也可以定义为引用另一个表中 UNIQUE 约束的列。”
因此,在给定的模式中,将唯一约束应用于 table1 中的 AnotherID 将允许创建外键约束。
<code class="language-sql">ALTER TABLE table1 ADD CONSTRAINT UQ_AnotherID UNIQUE (AnotherID);</code>
但是,需要注意的是,如果存在备选主键候选,则使用它通常是更合适的方法。
以上是如何创建引用非主键列的外键约束?的详细内容。更多信息请关注PHP中文网其他相关文章!