📜  SQL中的外键约束

📅  最后修改于: 2022-05-13 01:55:00.516000             🧑  作者: Mango

SQL中的外键约束

外键是引用其他表的主键/唯一键的列。因此它展示了表之间的关系并作为它们之间的交叉引用。定义了外键的表称为外表/引用表。定义主键/唯一键并被外键引用的表称为主表/主表/被引用表。它在 Create table/Alter table 语句中定义。

对于包含外键的表,它应该匹配引用表中每一行的主键。这称为参照完整性。外键确保参照完整性。

特性 :

  • 被引用的父项必须是唯一的/主键。
  • 孩子可能有重复和空值。
  • 如果不存在子记录,则可以删除父记录。
  • 如果子表存在,则无法更新主表。
  • 必须在主表中引用 PRIMARY KEY。
  • 外键列和约束列应具有匹配的数据类型。
  • 如果主表中不存在对应的记录,则无法在子表中插入记录。
  • 如果子表中的相应记录存在,则无法删除主表的记录。
  1. 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.
      
  2. 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));
    

    可以忽略引用表的列名。

  3. 在外键表中插入操作:
    如果外部表中不存在对应的值,则无法插入子表中的记录。
    OUTPUT : 
    Error at line 1 : integrity constraint violated - parent key not found.
    
  4. 外键表中的删除操作:
    当主表中的一条记录被删除,而子表中存在相应的记录时,会显示错误信息并阻止删除操作的进行。
    OUTPUT : 
    Error at line 1 : integrity constraint violated - child record found.
    
  5. 带有 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 
  6. 带有 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。但记录不会被删除。