外键约束

2017-10-27  本文已影响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;

上一篇下一篇

猜你喜欢

热点阅读