首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果您已经在列定义中添加了引用约束,那么还需要定义外键约束吗?

问如果您已经在列定义中添加了引用约束,那么还需要定义外键约束吗?
EN

Stack Overflow用户
提问于 2022-10-18 06:38:27
回答 2查看 31关注 0票数 -1

我试图理解定义表的语法,并注意到列定义包括一个选项,即该列引用来自另一个表的列。

如果我已经可以在这里定义它,是否仍然需要再次显式地定义指定该列的外键约束?为什么?

因为我认为作为列约束添加的引用定义应该已经考虑到列是外键这一事实(因为它引用的是另一个表)。

用于清晰度的示例代码:

a)

代码语言:javascript
复制
create table SAMPLE (
sample_id INT PRIMARY KEY,
client_id INT REFERENCES CLIENT (client_id)
);

b)

代码语言:javascript
复制
create table SAMPLE (
sample_id INT PRIMARY KEY,
client_id INT NOT NULL,
CONSTRAINT fk_sample_client
   FOREIGN KEY (client_id) REFERENCES CLIENT (client_id)
);

定义(a)是否确保将clientId标识为外键,是否与定义(b)相同?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-18 06:59:34

忽略作为列定义一部分的引用。

重要 对于熟悉ANSI/ISO标准的用户,请注意没有存储引擎(包括InnoDB )识别或强制执行引用完整性约束定义中使用的匹配子句。使用显式匹配子句没有指定的效果,也会导致删除和更新子句被忽略。由于这些原因,应该避免指定匹配。 SQL标准中的MATCH子句控制在与主键比较时如何处理复合(多列)外键中的空值。InnoDB本质上实现了MATCH SIMPLE定义的语义,允许外键全部或部分为NULL。在这种情况下,允许插入包含此类外键的(子表)行,并且与引用(父表)表中的任何行不匹配。可以使用触发器实现其他语义。 此外,MySQL还要求对引用的列进行索引以提高性能。但是,InnoDB不强制要求所引用的列声明为唯一列或非NULL列。对非唯一键或包含空值的键的外键引用的处理对于诸如UPDATE或DELETE级联之类的操作没有很好的定义。建议您使用只引用唯一(或主)和非空的键的外键。 MySQL解析但忽略了“内联引用规范”(如SQL标准中定义的),其中引用被定义为列规范的一部分。只有在指定为单独外键规范的一部分时,MySQL才接受引用子句。有关更多信息,请参见1.7.2.3节“外键约束差异”。

来源:https://dev.mysql.com/doc/refman/8.0/en/create-table.html

票数 1
EN

Stack Overflow用户

发布于 2022-10-18 07:13:35

作为西蒙共享,列定义中的内联引用被mySQL和此链接忽略,并进一步解释了原因。

定义列以使用引用tbl_name(col_name)子句没有实际效果,和只是作为对您的的备注或注释,您当前定义的列用于引用另一个表中的列。

简单地说,语法仍然只创建列;它不会将它指定为外键,也不会对它执行任何检查。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74106668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档