SQL中的外键约束
外键是引用其他表的主键/唯一键的列。因此它展示了表之间的关系并作为它们之间的交叉引用。定义了外键的表称为外表/引用表。定义主键/唯一键并被外键引用的表称为主表/主表/被引用表。它在 Create table/Alter table 语句中定义。
对于包含外键的表,它应该匹配引用表中每一行的主键。这称为参照完整性。外键确保参照完整性。
特性 :
- 被引用的父项必须是唯一的/主键。
- 孩子可能有重复和空值。
- 如果不存在子记录,则可以删除父记录。
- 如果子表存在,则无法更新主表。
- 必须在主表中引用 PRIMARY KEY。
- 外键列和约束列应具有匹配的数据类型。
- 如果主表中不存在对应的记录,则无法在子表中插入记录。
- 如果子表中的相应记录存在,则无法删除主表的记录。
- SQL 外键在列级别:
句法 -
Create table people (no int references person, Fname varchar2(20)); OR Create table people (no int references person(id), Fname varchar2(20));
这里 Person 表应该有类型为 int 的主键。如果表中有单列主键,则语法中的列名可以省略。所以上述两种语法都可以正常工作。
要检查约束,
- 如果父表没有主键。
OUTPUT : Error at line 1 : referenced table does not have a primary key.
- 如果父表具有不同数据类型的主键。
OUTPUT : Error at line 1 : column type incompatible with referenced column type.
- 如果父表没有主键。
- SQL 外键在表级别:
句法 -
create table people(no varchar2(10), fname varchar2(20), foreign key(no) references person); OR create table people(no varchar2(10), fname varchar2(20), foreign key(no) references person(id));
可以忽略引用表的列名。
- 在外键表中插入操作:
如果外部表中不存在对应的值,则无法插入子表中的记录。OUTPUT : Error at line 1 : integrity constraint violated - parent key not found.
- 外键表中的删除操作:
当主表中的一条记录被删除,而子表中存在相应的记录时,会显示错误信息并阻止删除操作的进行。OUTPUT : Error at line 1 : integrity constraint violated - child record found.
- 带有 ON DELETE CASCADE 的外键:
可以使用 ON DELETE CASCADE 更改外键的默认行为。当在外键定义中指定该选项时,如果主表中的一条记录被删除,则详细表中所有对应的记录将被删除。句法 -
create table people(no varchar2(10), fname varchar2(20), foreign key(no) references person on delete cascade);
现在从 person 中删除记录将删除子表中所有相应的记录。
OUTPUT : select * from person; no rows selected select * from people; no rows selected
- 带有 ON DELETE SET NULL 的外键:
SET NULL ON DELETE 的外键表示如果删除父表中的记录,子表中相应记录的外键字段将设置为空。子表中的记录不会被删除。句法 -
create table people(no varchar2(10), fname varchar2(20), foreign key(no) references person on delete set null);
OUTPUT : select * from person; no rows selected select * from people; NO Fname pqr
注意 people 表中引用 Person 表主键的字段“No”。在删除人员数据时,它将在子表 people 中设置为 null。但记录不会被删除。