美文网首页
外键约束

外键约束

作者: 诗人小坏 | 来源:发表于2017-10-27 14:02 被阅读0次

    外键的定义:

    如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。

    外键的作用

    • 实现参照完整性
    • 不同外键约束方式使两张表紧密结合
    • 级联操作(修改或者删除)使日常维护工作更加轻松
    • 保证数据的完整性和一致性

    外键的用法

    *两个表必须是InnoDB表

    • 外键列必须建立索引(MySQL 4.1.2以后版本在建立外键时会自动创建索引)
    • 外键关系的两个表的列数据类型必须相似

    外键约束选项中的5种动作

    *CASCADE: 从父表中删除或更新对应的行,同时自动的删 除或更新自表中匹配的行。ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。

    • SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持。
    • NO ACTION: InnoDB拒绝删除或者更新父表。
    • RESTRICT: 拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。
    • SET DEFAULT: InnoDB目前不支持。
      外键约束使用最多的两种情况
      1.父表更新时子表也更新,父表删除时如果子表有匹配的 项,删除失败;
      eg:ON UPDATE CASCADE ON DELETE RESTRICT;
      2.父表更新时子表也更新,父表删除时子表匹配的项也删除。
      eg:ON UPDATE CASCADE ON DELETE CASCADE。

    例子:

    articlecategory两个表为例

    1.创建数据表article;

    CREATE TABLE IF NOT EXISTS article (
    id int(11) NOT NULL AUTO_INCREMENT,
    category_id int(11) NOT NULL,
    name char(16) NOT NULL,
    PRIMARY KEY (id),
    KEY fk_1 (category_id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

    2.在article中插入一条记录

    INSERT INTO article (id, category_id, name) VALUES
    (1, 1, '文章1');

    3.创建数据表category

    CREATE TABLE IF NOT EXISTS category (
    id int(11) NOT NULL AUTO_INCREMENT,
    name char(16) NOT NULL,
    PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

    4.在category中插入记录

    INSERT INTO category (id, name) VALUES
    (1, '分类1');

    5.创建外键约束

    ALTER TABLE article
    ADD CONSTRAINT fk_1 FOREIGN KEY (category_id) REFERENCES category (id);

    6.删除主表category中数据:

    delete FROM category WHERE id=1,会报错:
    1451 - Cannot delete or update a parent row: a foreign key constraint fails (test.article, CONSTRAINT fk_1 FOREIGN KEY (category_id) REFERENCES category (id))

    7.从表article中,添加不存在的category_id:insert into article(category_id,name) values(2,'分类2') 会报错:

    1452 - Cannot add or update a child row: a foreign key constraint fails (test.article, CONSTRAINT fk_1 FOREIGN KEY (category_id) REFERENCES category (id))

    8.更改更新删除约束
    --删除外键

    ALTER TABLE article DROP FOREIGN KEY fk_1

    --添加外键

    ALTER TABLE article ADD CONSTRAINT fk_1 FOREIGN KEY ( category_id )
    REFERENCES category ( id )
    ON DELETE CASCADE ON UPDATE CASCADE

    --此时article中的记录也会被删除

    delete from category where id=1;

    --此时article中的category_id也会被更新成3

    UPDATE test.category SET id = '3' WHERE category.id =2;

    相关文章

      网友评论

          本文标题:外键约束

          本文链接:https://www.haomeiwen.com/subject/wiirpxtx.html