mysql--外键学习

Posted Hhhighway

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql--外键学习相关的知识,希望对你有一定的参考价值。

外键的使用

  • 外键的概念:

    一个表的主键在另外一个表中出现,在另外一个表中称为外键

  • 作用:表间的数据插入、更新的时候的一种约束

  • 语法

    [CONSTRAINT constraint_name]
    FOREIGN KEY [foreign_key_name] (columns)
    REFERENCES parent_table(columns)
    [ON DELETE action]
    [ON UPDATE action`CONSTRAINT`]
    
    1. CONSTRAINT子句允许您为外键约束定义约束名称。如果省略它,mysql将自动生成一个名称 。
    2. FOREIGN KEY子句指定子表中引用父表中主键列的列。您可以在FOREIGN KEY子句后放置一个外键名称,或者让MySQL为您创建一个名称。 请注意,MySQL会自动创建一个具有foreign_key_name名称的索引。
    3. REFERENCES子句指定父表及其子表中列的引用。 在FOREIGN KEYREFERENCES中指定的子表和父表中的列数必须相同。
    4. ON DELETE子句允许定义当父表中的记录被删除时,子表的记录怎样执行操作。如果省略ON DELETE子句并删除父表中的记录,则MySQL将拒绝删除子表中相关联的数据。此外,MySQL还提供了一些操作,以便您可以使用其他选项,例如on delete cascade,当删除父表中的记录时,MySQL可以删除子表中引用父表中记录的记录。 如果您不希望删除子表中的相关记录,请改用ON DELETE SET NULL操作。当父表中的记录被删除时,MySQL会将子表中的外键列值设置为NULL,条件是子表中的外键列必须接受NULL值。 请注意,如果使用ON DELETE NO ACTIONON DELETE RESTRICT操作,MySQL将拒绝删除。
    5. ON UPDATE子句允许指定在父表中的行更新时,子表中的行会怎样执行操作。当父表中的行被更新时,可以省略ON UPDATE子句让MySQL拒绝对子表中的行的任何更新ON UPDATE CASCADE操作允许您执行交叉表更新,并且当更新父表中的行时,ON UPDATE SET NULL操作会将子表中行中的值重置为NULL值。 ON UPDATE NO ACTIONUPDATE RESTRICT操作拒绝任何更新。
  • 创建外键:

    在MySQL中,InnoDB存储引擎支持外键,因此您必须创建InnoDB表才能使用外键约束。

    • 已经存在的表建立外键:

      ALTER TABLE products
      ADD FOREIGN KEY fk_vendor(vdr_id)
      REFERENCES vendors(vdr_id)
      ON DELETE NO ACTION # 允许删除
      ON UPDATE CASCADE; # 不允许更新
      
    • 创建表的时候建立外键

      CREATE TABLE products(
         prd_id int not null auto_increment primary key,
         prd_name varchar(355) not null,
         prd_price decimal,
         cat_id int not null,
         FOREIGN KEY fk_cat(cat_id)
         REFERENCES categories(cat_id)
         ON UPDATE CASCADE # 允许更新
         ON DELETE RESTRICT # 不允许删除
      )ENGINE=InnoDB;
      
  • 删除外键:

    • 查看外键名称: show create table 表名;
    • alter table 表名 drop foreign key 外键名;

以上是关于mysql--外键学习的主要内容,如果未能解决你的问题,请参考以下文章

flask mysql 外键的学习

mysql--外键学习

MySQL数据库学习笔记----MySQL多表查询之外键表连接子查询索引

零基础带你学习MySQL—foreign key 外键(二十六)

Mysql学习总结(19)——Mysql无法创建外键的原因

Python学习日记(三十四) Mysql数据库篇 二