首页 > 数据库 > mysql教程 > 如何创建引用非主键列的外键约束?

如何创建引用非主键列的外键约束?

Barbara Streisand
发布: 2025-01-15 09:27:42
原创
442 人浏览过

How Can I Create a Foreign Key Constraint Referencing a Non-Primary Key Column?

使用外键维护非主键列的参照完整性

在数据库系统中,外键用于建立表之间的关系并强制执行参照完整性。通常,外键引用其他表中的主键,以确保从属表中的数据一致。但是,在某些情况下,可能需要创建指向非主键列的外键。

让我们考虑问题中描述的场景,其中一个表 (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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板