zoukankan      html  css  js  c++  java
  • mysq foreign外键记录

    MySQL的外键约束FOREIGN KEY

    一、建立外键约束

    [CONSTRAINT [symbol]] FOREIGN KEY
     [index_name] (col_name, ...)
     REFERENCES tbl_name (col_name,...)
     [ON DELETE reference_option]
     [ON UPDATE reference_option]
    reference_option:
     RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

    1.CONSTRAINT [symbol]]指定约束名字,不写则系统自动生成外键约束名;
    2.MySQL强制外键约束的列上必须要有索引, [index_name]指定索引名,不写则系统自动生成索引名,如果已经存在可以用于支持外键约束的索引,那么指定的索引名则无效,采用已有的索引;
    3.[ON DELETE reference_option]和[ON UPDATE reference_option]指定主表update和delete操作时,子表对应的数据怎么响应;
    • cascade:从父表删除或者更新且自动删除或更新子表中匹配的行
    • set null:从父表删除或更新行,并设置子表中的外键行为null,如果使用该选项,必须保证子表列没有指定not null
    • restrict:拒绝对父表的删除或更新操作。
    • no action:标准SQL的关键字,在mysql中于restrict相同

    二、添加外键约束

    ALTER TABLE tbl_name
     ADD [CONSTRAINT [symbol]] FOREIGN KEY
     [index_name] (col_name, ...)
     REFERENCES tbl_name (col_name,...)
     [ON DELETE reference_option]
     [ON UPDATE reference_option]

    添加外键约束的两种方式
    Alter table 表名 add constraint FK_ID foreign key(外键字段名) REFERENCES 外表表名(主键字段名);

    -- 添加外键约束
    CREATE TABLE stu(
        sid INT PRIMARY KEY,
        NAME VARCHAR(50) NOT NULL
    );
    -- 添加外键约束方式一
    CREATE TABLE score1(
        score DOUBLE,
        sid INT,
        CONSTRAINT fk_stu_score1_sid FOREIGN KEY(sid) REFERENCES stu(sid)
    );
    -- 添加外键约束方式二(若表已存在,可用这种)
    CREATE TABLE score1(
        score DOUBLE,
        sid INT
    );

    三、删除或解除外键约束

    1.查看数据库表创建的sql语句
    show create table vip
    2.查看外键的约束名
    CREATE TABLE `vip` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `id_code` varchar(255) DEFAULT NULL,
      `user_id` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `FK1C81D1738DA76` (`user_id`),
      CONSTRAINT `FK1C81D1738DA76` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8
    3.解除外键约束
    alter table vip drop foreign key FK1C81D1738DA76
    4.删除外键
    alter table vip drop user_id

    四、外键约束注意事项

    • 外键上无法插入主表没有的数据,也无法更新为主表没有的数据;
    • 外键上必须要有索引,主表上对应的列最好也创建索引,因为当子表外键插入数据时,也是需要到主表对应的列上去检查数据是否存在,有索引可以提高效率;
    • 如果一个表被其他表的外键引用,则这个表无法被删除;如果通过set foreign_key_checks=0强制删除主表,则子表无法插入任何数据;
    • 外键的字段类型,字符集必须要跟引用的字段一致,unsigned属性也要一致,否则无法创建外键约束;
    • 被引用的列上必须要有索引,否则无法创建外键约束。
  • 相关阅读:
    LeetCode(35):Palindrome Number 分类: leetCode 2015-07-10 09:26 161人阅读 评论(0) 收藏
    在pycharm进行单元测试(unittest python)
    Django 基本操作
    Django中数据库操作相关的错误
    Question&&Answer
    ubuntu下 SVN 服务器搭建及使用
    python 在不同层级目录import 模块的方法
    Ubuntu 16.04安装PyCharm
    修改mysql中数据库存储主路径
    查看mysql的数据库物理存放位置
  • 原文地址:https://www.cnblogs.com/wzb-liumangtu/p/13320866.html
Copyright © 2011-2022 走看看