外键约束

如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。这里以MySQL为例,总结一下3种外键约束方式的区别和联系。

外键约束对子表的含义:

如果在父表中找不到候选键,则不允许在子表上进行insert/update

外键约束对父表的含义:

在父表上进行update/delete以更新或删除在子表中有一条或多条对应匹配行的候选键时,父表的行为取决于:在定义子表的外键时指定的on update/on delete子句, InnoDB支持5种方式, 分列如下

. cascade方式

在父表上update/delete记录时,同步update/delete掉子表的匹配记录

On delete cascade从mysql3.23.50开始可用; on update cascade从mysql4.0.8开始可用

. set null方式

在父表上update/delete记录时,将子表上匹配记录的列设为null

要注意子表的外键列不能为not null

On delete set null从mysql3.23.50开始可用; on update set null从mysql4.0.8开始可用

. No action方式

如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作

这个是ANSI SQL-92标准,从mysql4.0.8开始支持

. Restrict方式

同no action, 都是立即检查外键约束

. Set default方式

解析器认识这个action,但Innodb不能识别,不知道是什么意思...

这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组。 
     首先创建用户组表:

Sql代码  

  1. create table t_group (
  2. id int not null,
  3. name varchar(30),
  4. primary key (id)
  5. );

并插入两条记录:

Sql代码  

  1. insert into t_group values (1, ‘Group1‘);
  2. insert into t_group values (2, ‘Group2‘);

下面创建用户表,分别以不同的约束方式创建外键引用关系: 
1、级联(cascade)方式

Sql代码  

  1. create table t_user (
  2. id int not null,
  3. name varchar(30),
  4. groupid int,
  5. primary key (id),
  6. foreign key (groupid) references t_group(id) on delete cascade on update cascade
  7. );

参照完整性测试

Sql代码  

  1. insert into t_user values (1, ‘qianxin‘, 1); --可以插入
  2. insert into t_user values (2, ‘yiyu‘, 2);    --可以插入
  3. insert into t_user values (3, ‘dai‘, 3);    --错误,无法插入,用户组3不存在,与参照完整性约束不符

约束方式测试

Sql代码  

  1. insert into t_user values (1, ‘qianxin‘, 1);
  2. insert into t_user values (2, ‘yiyu‘, 2);
  3. insert into t_user values (3, ‘dai‘, 2);
  4. delete from t_group where id=2;              --导致t_user中的2、3记录级联删除
  5. update t_group set id=2 where id=1;          --导致t_user中的1记录的groupid级联修改为2

2、置空(set null)方式

Sql代码  

  1. 置空方式
  2. create table t_user (
  3. id int not null,
  4. name varchar(30),
  5. groupid int,
  6. primary key (id),
  7. foreign key (groupid) references t_group(id) on delete set null on update set null
  8. );
  9. 参照完整性测试
  10. insert into t_user values (1, ‘qianxin‘, 1); --可以插入
  11. insert into t_user values (2, ‘yiyu‘, 2);    --可以插入
  12. insert into t_user values (3, ‘dai‘, 3);     --错误,无法插入,用户组3不存在,与参照完整性约束不符
  13. 约束方式测试
  14. insert into t_user values (1, ‘qianxin‘, 1);
  15. insert into t_user values (2, ‘yiyu‘, 2);
  16. insert into t_user values (3, ‘dai‘, 2);
  17. delete from t_group where id=2;              --导致t_user中的2、3记录的groupid被设置为NULL
  18. update t_group set id=2 where id=1;          --导致t_user中的1记录的groupid被设置为NULL

3、禁止(no action / restrict)方式

Sql代码  

    1. 禁止方式
    2. create table t_user (
    3. id int not null,
    4. name varchar(30),
    5. groupid int,
    6. primary key (id),
    7. foreign key (groupid) references t_group(id) on delete no action on update no action
    8. );
    9. 参照完整性测试
    10. insert into t_user values (1, ‘qianxin‘, 1); --可以插入
    11. insert into t_user values (2, ‘yiyu‘, 2);    --可以插入
    12. insert into t_user values (3, ‘dai‘, 3);     --错误,无法插入,用户组3不存在,与参照完整性约束不符
    13. 约束方式测试
    14. insert into t_user values (1, ‘qianxin‘, 1);
    15. insert into t_user values (2, ‘yiyu‘, 2);
    16. insert into t_user values (3, ‘dai‘, 2);
    17. delete from t_group where id=2;              --错误,从表中有相关引用,因此主表中无法删除
    18. update t_group set id=2 where id=1;          --错误,从表中有相关引用,因此主表中无法修改

外键约束

时间: 2024-09-29 18:48:26

外键约束的相关文章

SQL中创建外键约束

alter table 表名 add constraint 外键约束名 foreign key(列名) references 引用外键表(列名)

MySQL的外键约束:Cascade/Restrict/No action/SET NULL

转自:http://blog.csdn.net/cnjsnt_s/article/details/5548280 具体使用时需要参考:http://blog.csdn.net/codeforme/article/details/5539454 (注:没看很明白,囧.) MySQL有两种常用的引擎类型:MyISAM和InnoDB.目前只有InnoDB引擎类型支持外键约束.InnoDB中外键约束定义的语法如下: [CONSTRAINT [symbol]] FOREIGN KEY [index_nam

mysql的外键约束

创建表格: #首先登录mysql mysql -uroot 打开一个数据库 mysql>use db1; 创建一个父表,我们命名为province, mysql> create table province ( -> id smallint auto_increment key, -> name varchar(10) NOT NULL -> ); 创建一个子表,命名为student,其中其pid引用来自province的id, mysql> create table

外键约束 以及 数据库中实体的对应关系(1==1,1==n,n==n)

1.1.1 外键约束 Create database day16; Use day16; 创建部门表: create table dept( did int primary key auto_increment, dname varchar(20) ); insert into dept values (null,'研发部'); insert into dept values (null,'教研部'); insert into dept values (null,'市场部'); 创建员工表: c

牛腩新闻发布系统---外键约束下如何删除记录

一.为什么使用外键? 查了些资料,八个字"保持完整性.一致性",结合我之前做的重构机房收费系统,我的理解是"防止相关表中数据没有关联而变得孤立,最终导致数据冗余",得出这个结论是上次让贾丽敏帮忙点系统时候我最深刻的感受,因为我的数据库关系图中辣么多张表却没有丝毫关系-- 既然官方解释是"完整性和一致性",就先来说明一下: 对于完整性和一致性,不少人都混为一谈了. 完整性(integrity)更多是针对实际业务来说的,比如说一个职员ID,不能在一个

sql完美删除外键约束,避免产生问题

解决无法删除表,提示被外键约束引用 有时想删除某个表时,提示“无法删除对象 'Orders',因为该对象正由一个 FOREIGN KEY 约束引用”,原因很简单不要急躁,它被其它表的外键引用了,所以无法删除,在此只需先找到哪些表的外键引用了该表的字段.通过系统函数就能解决(SQL Server系统函数提供了非常完善的功能,能代替我们查找和解决许多问题). select     fk.name,fk.object_id,OBJECT_NAME(fk.parent_object_id) as ref

sql查询指定表外键约束

//////////////////查询指定表外键约束select a.name as 约束名, object_name(b.parent_object_id) as 外键表, d.name as 外键列, object_name(b.referenced_object_id) as 主健表, c.name as 主键列 from sys.foreign_keys A inner join sys.foreign_key_columns B on A.object_id=b.constraint

理解外键约束

--自定义账户访问别的用户的表 select * from scott.emp; select * from scott.dept; --foreign key 外键约束 --创建班级表 create table t_class( cid number(6), cname varchar2(12) ) --方式三:添加班级约束 alter table t_class add constraints pk_class primary key(cid); alter table t_class mo

goldengate 灾备端外键约束导致 ora-01403 (delete)

bl2灾备端报错ora-01403 2016-07-11 14:10:52  WARNING OGG-01004  Aborted grouped transaction on 'ESOP_CRM.PRODUCTORDERCHARACTER', Database error 1403 (OCI Error ORA-01403: no data found, SQL <DELETE FROM "ESOP_CRM"."PRODUCTORDERCHARACT ER"

数据库 SQL 外键约束 多表查询

多表设计与多表查询 1.外键约束        表是用来保存现实生活中的数据的,而现实生活中数据和数据之间往往具有一定的关系,我们在使用表来存储数据时,可以明确的声明表和表之前的依赖关系,命令数据库来帮我们维护这种关系,像这种约束就叫做外键约束.          定义外键约束  foreign key(本表的列名 ordersid) references orders(id)(引用的表明及列名)     create table dept(         id int primary key