mysql中外键约束级联更新与删除

本文介绍MySQL中外键约束的级联更新与级联删除功能,通过实例演示如何实现主表记录变动时从表自动同步更新或删除相关记录。


默认情况下,mysql的外键约束类型是restrict (no action)类型 ,表示一般的外键约束。


ON DELETE CASCADE ON UPDATE CASCADE   可以设置外键为级联更新、级联删除。

当主表的关联字段发生变更时,从表自动做相应的改变。

级联删除:当主表的关联记录被删除时,从表会自动删除与主表删除记录相关联的记录。

级联更新:   当主表的记录(一般是主键值)发生更新时,从表自动更新自己的外键值。

示例:

创建t_user表


CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

创建  t_address

一个用户能有多个收货地址,所以用户到地址是一对多的关系,并设置级联更新与级联删除。


CREATE TABLE `t_address` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `province` varchar(32) DEFAULT NULL,
  `city` varchar(32) DEFAULT NULL,
  `detialAddress` varchar(200) DEFAULT NULL,
  `user_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  CONSTRAINT `t_address_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`) 

  ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8

插入一些测试数据



 INSERT INTO t_user (NAME) VALUES 
 ('张三'),('李四'),('王五'); 
 
 INSERT INTO t_address(province,city,detialAddress,user_id) VALUES
 ('湖北','武汉','雄楚大道101号',1),
 ('湖北','武汉','关山大道110号',1),
 ('湖北','武汉','珞喻路92号',1),
 ('湖南','长沙','aaa路aaa号',2),
 ('湖南','长沙','aaa路bbb号',2),
 ('湖南','长沙','aaa路ccc号',2)   ;


这时发现用户表中3条记录,地址表中6表条记录。张三有3个收货地址,李四也是,王五没有收货地址。

这时,更新用户表中id为1的记录,更新id值为10 ,这时发现地址表中前3条记录的外键(user_id)值都从1更新为了10

 UPDATE  t_user a SET a.`id` =10  WHERE a.`id`=1;  #执行这个sql语句时不会报外键约束的错,因为从表外键列上设置了级联更新。


如果主表执行删除   ,则会自动删除从表中的相应记录。

 DELETE FROM t_user WHERE t_user.`id`=1 ; #执行时不会报错,因为从表外键上设置了级联删除。


这时从t_address表中的,前3条记录就被级联删除了。 


注意:

如果主从表只是普通的外键约束,则在更新/删除主表记录时,需要先更新/删除从表记录,否则将会报外键约束异常,导致操作失败。

。。。。。。


### PostgreSQL 中外约束的使用方法及常见问题 #### 创建约束的概念中,它是用于维护两个表之间关系的一种机制。在 PostgreSQL 中创建时,可以通过 `CREATE TABLE` 或者 `ALTER TABLE` 来定义这种约束。以下是具体的语法: ```sql -- 在创建表时定义 CREATE TABLE child_table ( id SERIAL PRIMARY KEY, parent_id INTEGER REFERENCES parent_table(parent_id), name VARCHAR(100) ); ``` 上述代码展示了如何在一个新表中设置[^1]。这里的关字 `REFERENCES` 表明了当前列另一张表中的某一列存在关联。 对于已经存在的表,则可以采用如下方式添加: ```sql -- 对现有表添加 ALTER TABLE child_table ADD CONSTRAINT fk_parent FOREIGN KEY (parent_id) REFERENCES parent_table(id); ``` 此命令通过 `ALTER TABLE` 添加了一个名为 `fk_parent` 的到已有表上,并指定了该所参照的目标表及其对应字段。 #### 删除约束 当需要移除约束时,在 PostgreSQL 中可以直接操作系统的元数据表来完成这一动作。例如下面这条 SQL 命令能够删除特定模式下的所有匹配前缀条件的记录: ```sql DELETE FROM pg_constraint WHERE conname LIKE 'tbl_parent%'; ``` 这段脚本实现了对名称以 `'tbl_parent'` 开头的相关条目的清理工作[^2]。 值得注意的是,不同的数据库管理系统可能有不同的处理逻辑。比如 MySQL 数据库里要先查找出具体的名字再执行相应的删除指令;而在 PostgreSQL 上面则相对更加灵活一些,允许直接针对内部存储这些对象信息的地方进行修改[^3]。 #### 的作用意义 作为关系型数据库的重要组成部分之一,主要承担着保障跨表间引用完整性的职责。它确保了一方的数据始终指向另一方合法有效的实体实例,从而减少了孤立或者错误链接的风险。同时也能促进应用程序设计阶段就考虑到业务流程里的依赖关系,提高整体架构质量[^4]。 #### 常见问题解答 - **Q:** 如果忘记了自己的某个叫什么名字怎么办? 可以利用系统视图查询得到相关信息: ```sql SELECT * FROM information_schema.table_constraints WHERE constraint_type='FOREIGN KEY'; ``` 这样就可以查看所有的详情列表了。 - **Q:** 当尝试插入违反规则的新纪录时报错该如何应对? 需确认源端是否有对应的主值存在以及目标端是否设置了级联更新/删除选项等配置参数正确无误后再重试操作即可解决问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值