MYSQL外键约束的参照操作

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

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

  首先创建用户组表:

  创建用户组表

  create table t_group (

  id int not null,

  name varchar(30),

  primary key (id)

  );

  并插入两条记录:

  插入记录

  insert into t_group values (1, ‘Group1‘);

  insert into t_group values (2, ‘Group2‘);

  下面创建用户表,分别以不同的约束方式创建外键引用关系:

  1、级联(cascade)方式

  级联方式

  create table t_user (

  id int not null,

  name varchar(30),

  groupid int,

  primary key (id),

  foreign key (groupid) references t_group(id) on delete cascade on update cascade

  );

  参照完整性测试

  insert into t_user values (1, ‘qianxin‘, 1); #可以插入

  insert into t_user values (2, ‘yiyu‘, 2); #可以插入

  insert into t_user values (3, ‘dai‘, 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符

  约束方式测试

  insert into t_user values (1, ‘qianxin‘, 1);

  insert into t_user values (2, ‘yiyu‘, 2);

  insert into t_user values (3, ‘dai‘, 2);

  delete from t_group where id=2; #导致t_user中的2、3记录级联删除

  update t_group set id=2 where id=1; #导致t_user中的1记录的groupid级联修改为2

  2、置空(set null)方式

  置空方式

  create table t_user (

  id int not null,

  name varchar(30),

  groupid int,

  primary key (id),

  foreign key (groupid) references t_group(id) on delete set null on update set null

  );

  参照完整性测试insert into t_user values (1, ‘qianxin‘, 1); #可以插入

  insert into t_user values (2, ‘yiyu‘, 2); #可以插入

  insert into t_user values (3, ‘dai‘, 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符

  约束方式测试

  insert into t_user values (1, ‘qianxin‘, 1);

  insert into t_user values (2, ‘yiyu‘, 2);

  insert into t_user values (3, ‘dai‘, 2);

  delete from t_group where id=2; #导致t_user中的2、3记录的groupid被设置为NULL

  update t_group set id=2 where id=1; #导致t_user中的1记录的groupid被设置为NULL

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

  禁止方式

  create table t_user (

  id int not null,

  name varchar(30),

  groupid int,

  primary key (id),

  foreign key (groupid) references t_group(id) on delete no action on update no action

  );

  参照完整性测试

  insert into t_user values (1, ‘qianxin‘, 1); #可以插入

  insert into t_user values (2, ‘yiyu‘, 2); #可以插入

  insert into t_user values (3, ‘dai‘, 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符

  约束方式测试

  insert into t_user values (1, ‘qianxin‘, 1);

  insert into t_user values (2, ‘yiyu‘, 2);

  insert into t_user values (3, ‘dai‘, 2);

  delete from t_group where id=2; #错误,从表中有相关引用,因此主表中无法删除

  update t_group set id=2 where id=1; #错误,从表中有相关引用,因此主表中无法修改

  注:在MySQL中,restrict方式与no action方式作用相同。

原文出自【比特网】,转载请保留原文链接:http://soft.chinabyte.com/database/493/12549493.shtml

时间: 2024-08-25 22:50:58

MYSQL外键约束的参照操作的相关文章

mysql外键约束总结

总结三种MySQL外键约束方式 如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松.这里以MySQL为例,总结一下3种外键约束方式的区别和联系. 这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组. 首先创建用户组表: 创建用户组表 create table t_group ( id int not n

【转】MySQL外键约束On Delete、On Update各取值的含义

转载地址:http://hi.baidu.com/jxqlovejava/item/3d2cc5b5d689917c244b0920 ? 先看On Delete属性,可能取值如上图为:No Action, Cascade,Set Null, Restrict属性. 当取值为No Action或者Restrict时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除. 当取值为Cascade时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录

MySQL外键约束

如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表. 外键是用来保证数据的完整性和一致性,通过外键的检查而使不正确的删除,插入操作失败. 不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松. 触发器同样也能完成修改或者删除操作的级联操作,2者的区别如下(自己的理解): 1.触发器会更耗资源,对原表的操作和对从表的级联操作是在一个事务中的. 2.表的数据量不大,结构不复杂时优先考虑外键约束. 3.触发器比外键约

MySQL外键约束的使用

软件工程试验二中要求建立如下数据库: 使用MySQL建立一个“图书数据库“ BookDB,包含两张表:– Book {ISBN (PK), Title, AuthorID (FK), Publisher, PublishDate, Price}– Author {AuthorID (PK), Name, Age, Country} 其中FK是 foreign key的意思,即给Book数据表加上一个外键约束,下面先解释下外键约束的作用. 定义外键主要是为了维护关系数据库的完整性,使相关数据表之间

实体外键约束、级联操作

[实体关系]1.一对多:在多的表,增加一个字段,用于只想该实体所悟的另外的实体的标识.2.多对多:利用一个中间表,表示实体之间的对应关系.(中间表和实体表是一对多关系) [外键约束]foreign key (class_id) references tb_class (class_id); drop table if exists tb_class; create table tb_class( class_id int primary key auto_increment, class_nam

Mysql外键约束设置使用方法

如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松.外键主要用来保证数据的完整性和一致性 两个表必须是InnoDB表,MyISAM表暂时不支持外键 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立: 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列

MySql 外键约束 CASCADE、SET NULL、RESTRICT、NO ACTION

MySQL有两种常用的引擎类型:MyISAM和InnoDB.目前只有InnoDB引擎类型支持外键约束. CASCADE 在父表上update/delete记录时,同步update/delete掉子表的匹配记录 SET NULL 在父表上update/delete记录时,将子表上匹配记录的列设为null (要注意子表的外键列不能为not null) NO ACTION 如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作 RESTRICT 同no action, 都是

mysql外键约束的两种方法

3.添加外键的语法: 有两种方式: 方式一:在创建表的时候进行添加 方式二:表已经创建好了,继续修改表的结构来添加外键 [方式一]在创建表的时候进行添加 [CONSTRAINT symbol] FOREIGN KEY [id] (从表的字段1) REFERENCES tbl_name (主表的字段2) [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}] [ON UPDATE {RESTRICT | CASCADE | SET NULL 

MySql——外键约束

天剑外键约束的方法:alter table laser_upgrade_schedule add constraint fk_id_laser_upgrade_package foreign key (upgradeId) references laser_upgrade_package(id);