您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

MySQL学习10:外键约束下的更新操作

2024/4/15 16:07:05发布26次查看
上一篇只是讲述了外键约束的要求,并没有讲述外键约束的参照操作。这一次我来看看外键约束下的更新操作。 一外键约束的参照操作 我们进行外键约束的创建以后,在更新表的时候,子表是否也进行相应的更新。这是我们创建外键约束最大的好 处。有以下几种: 1)c
        上一篇只是讲述了外键约束的要求,并没有讲述外键约束的参照操作。这一次我来看看外键约束下的更新操作。
        一外键约束的参照操作       我们进行外键约束的创建以后,在更新表的时候,子表是否也进行相应的更新。这是我们创建外键约束最大的好
处。有以下几种:
       1)cascade:从父表删除或更新且自动删除或更新子表中匹配的行。
       2)set null:从父表删除或更新行,并设置子表中的外键列为null。如果使用该选项,必须保证子表列没有指
定not null。
       3)restrict:拒绝对父表的删除或更新操作。
       4)no action:标准sql的关键字,在mysql中与restrict相同。
       二更新外键约束的字段准备工作       (1)创建一个子表users1       create table users1(
          id smallint unsigned primary key auto_increment,
          username varchar(10) not null,
          pid smallint unsigned,
          foreign key (pid) references provinces (id) on delete cascade
       ); 
      show create table users1;
(2)在父表provinces插入记录并且查看父表的记录信息:      insert provinces(pname) values('a');
      insert provinces(pname) values('b');
      insert provinces(pname) values('c');
      select * from provinces;
(3)在子表users1插入记录:      insert users1(username,pid) values('tom',3);
      insert users1(username,pid) values('john',3);
      insert users1(username,pid) values('tom',6);
      insert users1(username,pid) values('rose',1);
      select * from users1;
由上面结果知道:如果外键列pid字段的数字大于3就不会插入记录,这是因为外键列pid字段参照的是父表
provinces中的参照列id字段,既然父表中id字段只存在3条,那么子表users1中插入的pid字段当然不能大于3;但是插
入记录会存在索引,这就是上面结果显示的原因,也是id字段为1,2,4的原因。
      三外键约束下的删除操作      假设我们把provinces数据表中的id=3的记录删除
      delete from provinces where id=3;
      select * from provinces; 
      select * from users1;
既然删除做到了,那么更新数据也会做到同样的效果,这里就不再进行举例说明。
      四更新操作参考      (1)on delete操作      restrict(约束):当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则不
允许删除。
      no action:意思同restrict,即如果存在从数据,不允许删除主数据。
      cascade(级联):当在父表(即外键的来源表)中删除对应记录时,首先检查该记录否有对应外键,如果有则也删
除外键在子表(即包含外键的表)中的记录。
      set null:当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表
中该外键值为null(不过这就要求该外键允许取null)。
       (2)on update操作       restrict(约束):当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则
不允许更新。
       no action:意思同restrict。
       cascade(级联):当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则也
更新外键在子表(即包含外键的表)中的记录。
       set null:当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则设置子
表中该外键值为null(不过这就要求该外键允许取null)。
       注:no action和restrict的区别:只有在及个别的情况下会导致区别,前者是在其他约束的动作之后执
行,后者具有最高的优先权执行。
       五表级约束与列级约束       按照参照数目的多少来划分:分为表级约束和列级约束。
       对一个数据列建立的约束,称为列级约束。列级约束既可以在列定义时声明,也可以在列定义后声明。
       对多个数据列建立的约束,称为表级约束。表级约束只能在列定义后声明。
       使用表级约束和列级约束需要注意的是:
       1not null约束和default约束不存在表级约束。其余的约束都存在列级约束和表级约束。
       2实际开发过程中,列级约束使用的较多,表级约束很少使用。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product