MySQl 外键约束(FOREIGN KEY)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43054397/article/details/91349095

外键约束的要求:

  1. 父表和子表必须使用相同的存储引擎,而且禁止使用临时表。
  2. 数据表的存储引擎只能为InnoDB
  3. 外键列和参照列必须具有相似的数据类型,也就是可以相互转换类型的列,比如 inttinyint 可以,而 intchar 则不可以
    • 数字类型的长度以及是否有符号(是否unsigned)必须相同
    • 字符类型的长度则可以不同
  4. 外键列和参照列必须创建索引。如果外键列不存在索引,MySQl将自动创建。
  5. 外键的名字不能重复

创建外键约束:

  • 创建外键约束方法:
    • 在创建时创建(如下面创建子表)

      [CONSTRAINT 外键名]  FOREIGN KEY (外键字段名) REFERENCES  父表名(参照字段名);
      
    • 创建表后增加 ALTER 操作

       ALTER TABLE 子表名 ADD [CONSTRAINT 外键名] FOREIGN KEY(外键字段名) REFERENCES 父表名(参照字段名);
      

    注: [ ] 中的为可省略的,如果创建时省略不定义外键名,MySQl 将会自动命名;

  • 创建表

    父表:
    CREATE TABLE teacher (
    	course varchar(16) NOT NULL,
        teacher char(16) NOT NULL,
    	PRIMARY KEY (course)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    子表:
    CREATE TABLE course (
    	id tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
        course varchar(16) NOT NULL,
    	PRIMARY KEY (id),
        FOREIGN KEY (course) REFERENCES teacher(course)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    字表中创建外键约束

    • 父表(teacher 表)中 参照列(course字段)必须创建了索引lchh
    • 外键列(course表中的course字段)和参照列(teacher 表中的course字段必须具有相似的数据类型,这里都为
          course varchar(16) NOT NULL 
          //这里varchar(16) 也可以写为 char类型 ,且长度可以不一样
          如 测试图-2
      
    • 数据表的存储引擎相同,且只能为InnoDB
      • 这里我们创建表时都加上 ENGINE=InnoDB 即可;
        这样我们才可以创建成功:
        测试图- 1
        lchh
        测试图- 2
        lchh
        反之 则会报错:
        Error Code: 1215. Cannot add foreign key constraint	0.468 sec
        

外键的定制作用 ---- 约束模式:

  • DISTRICT:严格模式(默认), 父表不能删除或更新一个被子表引用的记录;

  • CASCADE :级联模式, 父表操作后,子表关联的数据也跟着一起操作。也就是父表删除或更新后自动删除或更新子表中匹配的行;

  • SET NULL:置空模式, 父表操作后,子表对应的字段被置空,前提外键字段没有指定 NOT NULL ;

  • NO ACTION 标准的SQL 关键字,在 MySQl 中 作用与 DISTRICT 相同

  • SET DEFAULT 设默认值

所以完整语法:

[CONSTRAINT 外键名]  FOREIGN KEY (外键字段名) REFERENCES  父表名(参照字段名);
	[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
	[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

删除外键约束:

   ALTER TABLE 表名 DROP FOREIGN KEY 外键名;

外键约束的作用:

  • 对子表(外键所在的表)的作用:子表在进行写操作的时候,如果外键字段在父表中找不到对应的匹配,操作就会失败。
  • 对父表的作用:对父表的主键字段进行删和改时,如果对应的主键在子表中被引用,操作就会失败。

猜你喜欢

转载自blog.csdn.net/weixin_43054397/article/details/91349095
今日推荐