玩转MySQL的外键约束之级联删除篇
mysql级联删除

mysql级联删除创建表1mysql>CREATE TABLE C(->-> id TINYINT PRIMARY KEY auto_increment,-> name VARCHAR (20),-> age INT ,-> is_marriged boolean -- show create table ClassCharger: tinyint(1)->-> );添加表1数据mysql>INSERT INTO C (name,age,is_marriged) VALUES ("冰冰",12,0),-> ("丹丹",14,0),-> ("歪歪",22,0),-> ("姗姗",20,0),-> ("⼩⾬",21,0);创建表2 并把⼦键和主键建⽴关联并添加级联删除mysql>CREATE TABLE S3(-> id INT PRIMARY KEY auto_increment,-> name VARCHAR (20),-> charger_id TINYINT,->FOREIGN KEY (charger_id) REFERENCES C(id) ON DELETE CASCADE-> );添加表2数据mysql>INSERT INTO S3(name,charger_id) VALUES ("alvi1",2),-> ("alvi2",4),-> ("alvi3",5),-> ("alvi4",3),-> ("alvi5",5),-> ("alvi6",3),-> ("alvi7",2);未删除前数据mysql>SELECT*from S3;+----+-------+------------+| id | name | charger_id |+----+-------+------------+|1| alvi1 |2||2| alvi2 |4||3| alvi3 |5||4| alvi4 |3||5| alvi5 |5||6| alvi6 |3||7| alvi7 |2|+----+-------+------------+mysql>select*from C;+----+------+------+-------------+| id | name | age | is_marriged |+----+------+------+-------------+|1|冰冰|12|0||2|丹丹|14|0||3|歪歪|22|0||4|姗姗|20|0||5|⼩⾬|21|0|+----+------+------+-------------+输⼊删除语句mysql>delete from C where id =4;删除后表数据mysql>select*from s3;+----+-------+------------+| id | name | charger_id |+----+-------+------------+|1| alvi1 |2||3| alvi3 |5||4| alvi4 |3||5| alvi5 |5||6| alvi6 |3||7| alvi7 |2|+----+-------+------------+6 rows in set (0.00 sec)mysql>select*from C;+----+------+------+-------------+| id | name | age | is_marriged |+----+------+------+-------------+|1|冰冰|12|0||2|丹丹|14|0||3|歪歪|22|0||5|⼩⾬|21|0|+----+------+------+-------------+------set null⽅式在⽗表上update/delete记录时,将⼦表上匹配记录的列设为null -- 要注意⼦表的外键列不能为not null先删除之前在s3的外键mysql>ALTER TABLE s3 DROP FOREIGN KEY s3_ibfk_1;添加set null⽅式mysql>alter table s3 add constraint s3_fk_cc foreign key (charger_id)->references c(id) on delete set null;查看表记录mysql>select*from s3;+----+-------+------------+| id | name | charger_id |+----+-------+------------+|1| alvi1 |2||3| alvi3 |5||4| alvi4 |3||5| alvi5 |5||6| alvi6 |3||7| alvi7 |2|+----+-------+------------+mysql>select*from C;+----+------+------+-------------+| id | name | age | is_marriged |+----+------+------+-------------+|1|冰冰|12|0||2|丹丹|14|0||3|歪歪|22|0||5|⼩⾬|21|0|+----+------+------+-------------+删除c表jilumysql>delete from C where id =3;s3表记录变为nullmysql>select*from s3;+----+-------+------------+| id | name | charger_id |+----+-------+------------+|1| alvi1 |2||3| alvi3 |5||4| alvi4 |NULL||5| alvi5 |5||6| alvi6 |NULL||7| alvi7 |2|+----+-------+------------+------Restrict⽅式 :拒绝对⽗表进⾏删除更新操作(了解)------No action⽅式在mysql中同Restrict,如果⼦表中有匹配的记录,则不允许对⽗表对应候选键 -- 进⾏update/delete操作(了解)。
MySQL外键约束的使用方法

MySQL外键约束的使用方法MySQL是一个非常流行的关系型数据库管理系统,其具备强大而灵活的特性,其中之一就是外键约束。
外键约束是在关系型数据库中用来建立表与表之间的关联关系的重要机制之一。
通过外键约束,可以实现表之间数据的完整性和一致性,提升数据库的操作效率和数据质量。
本文将介绍MySQL外键约束的使用方法,包括外键的创建、修改和删除等操作的详细步骤。
一、概述外键约束用于在一个表中创建一个字段,它与另一个表中已经存在的字段建立联系。
通过外键约束,可以保证表与表之间的数据完整性,即保证在关联表中的数据在关联字段上是一致的。
外键约束通过强制要求在关联表中的数据在关联字段上拥有相同的值来实现数据一致性。
在具体的使用中,外键约束可以限制插入和更新操作,以确保数据的准确性。
二、创建外键约束在MySQL中,可以使用ALTER TABLE语句来创建外键约束。
下面是创建外键约束的具体步骤:1. 创建表首先,需要创建两个相关的表。
假设我们有两个表,一个是orders表,另一个是customers表。
orders表用来存储订单信息,customers表用来存储客户信息。
2. 添加外键字段在orders表中,我们需要添加一个外键字段customer_id,用来与customers表中的主键字段id建立关联。
3. 创建外键约束使用ALTER TABLE语句来创建外键约束,具体语法如下:ALTER TABLE ordersADD CONSTRAINT fk_orders_customersFOREIGN KEY (customer_id) REFERENCES customers(id);其中,fk_orders_customers是外键约束的名称,可以根据实际情况给定一个有意义的名称。
customer_id是orders表中的外键字段,references customers(id)指定了该外键字段应该与customers表中的id字段关联。
关于mysql(Navicatpremium软件中)外键设置中“删除”和“更新”选项详解

关于mysql(Navicatpremium软件中)外键设置中“删除”和“更
新”选项详解
ON DELETE
restrict(约束):当在⽗表(即外键的来源表)中删除对应记录时,⾸先检查该记录是否有对应外键,如果有则不允许删除。
no action:意思同restrict.即如果存在从数据,不允许删除主数据。
cascade(级联):当在⽗表(即外键的来源表)中删除对应记录时,⾸先检查该记录是否有对应外键,如果有则也删除外键在⼦表(即包含外键的表)中的记录。
set null:当在⽗表(即外键的来源表)中删除对应记录时,⾸先检查该记录是否有对应外键,如果有则设置⼦表中该外键值为null(不过这就要求该外键允许取null)
ON UPDATE
restrict(约束):当在⽗表(即外键的来源表)中更新对应记录时,⾸先检查该记录是否有对应外键,如果有则不允许更新。
no action:意思同restrict.
cascade(级联):当在⽗表(即外键的来源表)中更新对应记录时,⾸先检查该记录是否有对应外键,如果有则也更新外键在⼦表(即包含外键的表)中的记录。
set null:当在⽗表(即外键的来源表)中更新对应记录时,⾸先检查该记录是否有对应外键,如果有则设置⼦表中该外键值为null(不过这就要求该外键允许取null)。
注:NO ACTION和RESTRICT的区别:只有在及个别的情况下会导致区别,前者是在其他约束的动作之后执⾏,后者具有最⾼的优先权执⾏。
mysql删除树状关联数据的方法

mysql删除树状关联数据的方法在MySQL中,要删除树状关联数据,可以使用递归查询和级联删除的方法。
下面将详细介绍这两种方法。
1. 递归查询删除方法:递归查询是一种通过循环自身查询的方法,用于查找和删除树状结构中的数据。
下面是使用递归查询删除树状关联数据的步骤:步骤一:找到根节点的所有子节点通过递归查询,找到根节点下的所有子节点。
可以使用MySQL的WITH RECURSIVE语句进行递归查询,例如:```WITH RECURSIVE cte AS (SELECT id, parent_idFROM your_tableWHERE id = root_id -- 根节点的IDUNION ALLSELECT t.id, t.parent_idFROM your_table tJOIN cte ON t.parent_id = cte.id)SELECT idFROM cte;```步骤二:删除所有子节点根据步骤一中找到的子节点,使用DELETE语句删除这些子节点,例如:```DELETE FROM your_tableWHERE id IN (SELECT id FROM cte);```步骤三:删除根节点删除根节点本身,使用DELETE语句,例如:```DELETE FROM your_tableWHERE id = root_id; -- 根节点的ID```通过以上步骤,可以删除树状关联数据。
2. 级联删除方法:MySQL中的级联删除可以通过在表定义时设置外键约束来实现。
下面是使用级联删除删除树状关联数据的步骤:步骤一:创建表时设置外键约束在创建表时,为对应的父子关系字段设置外键约束,并设置级联删除。
例如:```CREATE TABLE your_table (id INT PRIMARY KEY,parent_id INT,FOREIGN KEY (parent_id) REFERENCES your_table(id) ON DELETE CASCADE) ENGINE=InnoDB;```步骤二:删除根节点直接删除根节点的记录,所有与该根节点关联的子节点记录会自动被级联删除。
mysql级联删除ONDELETECASCADE

delete from calendar where id = 1 则 calendaritem 表中 calendarId 为 1 的记录会被同时删除。
注:级联更新 用 on update cascade 看情况使用。一、如果已经设置主外键关系,需 Nhomakorabea先删除。
ALTER TABLE calendaritem DROP FOREIGN KEY `FK_calendar_id`;
二、创建主外键关系
ALTER TABLE calendaritem ADD CONSTRAINT `FK_calendar_id` FOREIGN KEY (`calendarId` ) REFERENCES calendar (`id` ) ON DELETE CASCADE ON UPDATE RESTRICT;
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
mysql级联删除ONDELETECASCADE
说明:当删除父节点时,由数据库来帮助删除子节点,这样就不用我们显示地写代码先删子节点,再删父节点了。 1、calendar 为主表 2、calendaritem 为外键表
MySql数据库约束,主键和外键约束的添加删除,代码实现,sql语句实现

网络错误503请刷新页面重试持续报错请尝试更换浏览器或网络环境
MySql数 据 库 约 束 , 主 键 和 外 键 约 束 的 添 加 删 除 , 代 码 实 现, sql语句实现
--概述
对表中的数据进行限定,保证数据的正确性、有效性和完整性。
1. primary key:主键约束 要求表中有一个列 唯一 且 非空,通常我们使用id作为主键
4.默认值
限定某一列的默认值,再没有指定的情况下所有列的默认值为null
--创建表时指定字段默认值 create table 表名(
列名 数据类型 default 默认值, ... ... ); -- 默认值 CREATE TABLE stu6( id INT PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(32) DEFAULT NULL, sex VARCHAR(5) DEFAULT '男' );
2. unique:唯一约束
3.认值
5. foreign key:外键约束
1.主键约束
-- 给student表添加主键约束 ALTER TABLE student ADD PRIMARY KEY(id);
-- 创建表,指定主键约束 CREATE TABLE stu1( id INT PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(32) );
3.非空约束
create table 表名( 列名 数据类型 not null, -- 非空约束 列名 数据类型 unique not null -- (唯一+非空) 约束
); -- 唯一 + 非空 CREATE TABLE stu5(
MySQL:级联删除操作

MySQL:级联删除操作级联删除操作(了解)如果想实现删除主表数据的同时,也删除掉从表数据,可以使⽤级联删除操作级联删除ON DELETE CASCADE代码⽰例:删除 employee表,重新创建,添加级联删除-- 重新创建添加级联操作CREATE TABLE employee(eid INT PRIMARY KEY AUTO_INCREMENT,ename VARCHAR(20),age INT,dept_id INT,CONSTRAINT emp_dept_fk FOREIGN KEY(dept_id) REFERENCES department(id),-- 添加级联删除ON DELETE CASCADE);-- 添加数据INSERT INTO employee (ename, age, dept_id) VALUES ('张百万', 20, 1);INSERT INTO employee (ename, age, dept_id) VALUES ('赵四', 21, 1);INSERT INTO employee (ename, age, dept_id) VALUES ('⼴坤', 20, 1);INSERT INTO employee (ename, age, dept_id) VALUES ('⼩斌', 20, 2);INSERT INTO employee (ename, age, dept_id) VALUES ('艳秋', 22, 2);INSERT INTO employee (ename, age, dept_id) VALUES ('⼤玲⼦', 18, 2);-- 删除部门编号为2 的记录DELETE FROM department WHERE id =2;运⾏效果:员⼯表中外键值是2的记录,也被删除了。
mysql查询外键 删除时的定义

MySQL查询外键删除时的定义在MySQL中,当您定义外键约束时,您可以选择当引用的主键记录被删除或更新时应该发生什么。
这是通过ON DELETE和ON UPDATE子句来定义的。
以下是可能的操作:1.CASCADE: 当主键表中的记录被删除或更新时,外键表中的相关记录也会被删除或更新。
sqlFOREIGN KEY (child_table_column)REFERENCES parent_table(parent_table_column)ON DELETE CASCADEON UPDATE CASCADE;2.SET NULL: 当主键表中的记录被删除或更新时,外键表中的相关记录的外键列将被设置为NULL(前提是外键列允许NULL值)。
sqlFOREIGN KEY (child_table_column)REFERENCES parent_table(parent_table_column)ON DELETE SET NULLON UPDATE SET NULL;3.NO ACTION: 默认值。
如果主键表中的记录被删除或更新,MySQL将不允许这种操作,并抛出一个错误。
sqlFOREIGN KEY (child_table_column)REFERENCES parent_table(parent_table_column)ON DELETE NO ACTIONON UPDATE NO ACTION;4.SET DEFAULT: 当主键表中的记录被删除或更新时,外键表中的相关记录的外键列将被设置为默认值(前提是外键列有默认值)。
sql复制代码FOREIGN KEY (child_table_column)REFERENCES parent_table(parent_table_column)ON DELETE SET DEFAULTON UPDATE SET DEFAULT;5.RESTRICT: 与NO ACTION相似,它会阻止删除或更新主键表中的记录,如果这样做会导致外键表中存在孤立的记录。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
当前位置:IT168首页 > 技术开发 > 玩转MySQL的外键约束之级联删 2010年01月05日 IT168网站原创 作者:IT168 宇文 编辑:覃里 评论: 0条 本文Tag: IT业界 MySQL MySQL数据库管理
相关阅读:
史上最全的MYSQL备份方法 从MySQL 5.5发布看开源数据库新模式 MySQL创建者全球请愿 欲阻甲骨文收购
上一页 1 23下一页 查看全文 【内容导航】
第1页:在更新数据库时使用外键约束 第2页:不使用外键约束时的数据删除
第3页:使用外键约束时的数据删除
用户名:
【IT168 文档】如今,许多关系型数据库管理系统都提供了外键约束这一强大的功能特性, 它能够帮助我们自动地触发指定的动作,诸如删掉、更新数据库表的记录等,从而维护各数据库 表之间预定义的关系。本文将演示如何在MySQL中利用外键约束以级联方式删除数据。
对于PHP开发人员来说,在MySQL中使用InnoDB表时可以利用外键约束提供的许多的便利之 处,尽管MySQL宣布将来的版本支持MyISAM表。本文将演示当更新和删除父表数据时如何维护一 个数据库的完整性。
当然,在实际情况下,我们应该通过服务器端语言来执行这两个删除语句,而不是使用原 始的SQL命令;但是这里只是举例之用,就不用考虑这么多了。
我想您现在已经弄明白了使用MyISAM表时如何删除博客数据,以及有关的评论。因此,接下 来我们将重新构建这个例子,不过这次我们将让数据表使用InnoDB存储引擎和一个简单的外键约 束。
二、在更新数据库时使用外键约束
正如前面介绍的一样,上一篇文章论述如何运用外键约束维护两个示例InnoDB表之间的关 系:第一个表存储一些简单博客数据,而第二个表则存放这些博客的有关评论。这例子的巧妙之 处在于,它给子表定义了一个外键约束,从而允许我们在博客文章被删除时自动地删除有关的所
有评论。下面给出这两个表的定义,它们建立了一个一对多的关系:
一、简介
在上一篇文章中,我们讲解了如何在MySQL的InnoDB表中结合使用外键约束,即当父表中的 数据更新的同时如何触发对子表数据的级联更新操作。说老实话,从字面上描述级联更新过程有 些令人费解,如果通过SQL代码来演示的话则要轻松得多。那么,我们先用文章做简单表述,然 后给出具体的代码。在最简单的情况下,这个过程首先要创建一个父表和一个子表,在子表中定 义一个外键,然后规定当父表的数据更新时将发生什么动作。
使用外键约束的主要好处是,我们可以在数据库级别很轻松地对表之间的关系进行处理,而 无需在与数据层交互的应用程序内部实现这些逻辑。值得一提的是,这对于性能来说,可能会有 一些损失,尤其是程序规模较大的时候。当然,数据库性能问题不在本文的讨论范围之内,下面 我们演示如何使用外键约束在父表数据被删除时触发对子表数据的级联删除操作。下面看看我们 是如何将这些晦涩难懂的术语转换为一目了然的SQL代码的。
返回首页 返回IT168首页 登录 注册 最新 门户 论坛 新闻 文档 下载 商店 专题 CTO CIO 人才 图书 培训 wiki投稿 频道 Oracle DB2 SQL Server MySQL ERP Java .NET 开源 移动 管理 SOA 测 试 BI SCM 专区 IBM 微软 Oracle WebSphere 互动 空间 blog 圈子 IXPUB 社区 数据库技术 信息化 开发技术 项目管理 IBM软件技术 微软 专区 CUDA编程技术 移动开发
DROP TABLE IF EXISTS `test`.`comments`; CREATE TABLE `test`.`comments` ( `id` INT(10) UNSIGNED AUTO_INCREMENT, `blog_id` INT(10) UNSIGNED DEFAULT NULL, `comment` TEXT, `author` VARCHAR(45) DEFAULT NULL, PRIMARY KEY (`id`), KEY `blog_ind` (`blog_id`), CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`blog_id`) REFERENCES `blogs` (`id`) ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
实际上,以上代码片断模拟了博客应用程序运行时,我们发布了博客并有人张贴评论时, 程序在表blogs中插入一篇博客文章的有关数据,并在子表中插入有关评论的过程。现在,如果 我们删除了这篇博客,那么有关的评论也应该随之删除。
但是,我们该如何去做呢?别急,下面我们以SQL语句为例说明如何完成此任务:
DELETE FROM blogs WHERE id = 1 DELETE FROM comments WHERE blog_id = 1
这看起来非常不错,对吧?前面讲过,外键约束容许您将表之间的关系的维护工作委托给数 据库层,这意味着编写与数据层交互的应用程序时可以省去不少的代码。
此外,我们也可以触发级联删除操作,这与前面演示的情形非常类似。因此,下面我们继续 使用早先定义的两个示例表来演示当某篇博客文章的数据被删除时,如何利用外键约束删除相应 的评论。
密码:
匿名发言 找回密码 快速注册
提交发言
本文欢迎转载,转载请注明:转载自IT168 [ / ] 本文链接:/a2010/0104/832/000000832697.shtml 本文关键字: 外键约束 开源数据库 Mysql
`comment` TEXT,
`author` VARCHAR(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
好了,我们已经建好了两个示例表,需要注意的是,它们使用的是默认的MyISAM数据库引 擎,所以不支持外键约束。
DROP TABLE IF EXISTS `test`.`comments`; CREATE TABLE `test`.`comments` (
`id` INT(10) UNSIGNED AUTO_INCREMENT,
`blog_id` INT(10) UNSIGNED DEFAULT NULL,
三、不使用外键约束时的数据删除 为了说明当父表数据被删除时,外键约束在维护数据库完整性方面发挥的作用,我们将重建 前面的例子,这次使用MyISAM表。首先,我们需要定义数据表,具体代码如下所示: DROP TABLE IF EXISTS `test`.`blogs`; CREATE TABLE `test`.`blogs` ( `id` INT(10) UNSIGNED AUTO_INCREMENT, `title` TEXT, `content` TEXT, `author` VARCHAR(45) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
InnoDB引擎除了可以规定根据父表完成的操作对子表进行的级联更新以外,还可以执行其 他的操作,包括“NO ACTION”和“RESTRICT”,这样即使父表发生更新或者删除操作,也不会 引起对子表的任何操作。
现在,根据上面的MySQL表的定义,填充如下所示的数据:
INSERT INTO blogs (id, title, content, author) VALUES (NULL,'Title of the first bl og entry', 'Content of the first blog entry', 'Tom')
INSERT INTO comments (id, blog_id, comment, author) VALUES (NULL, 1, 'Commenting f irst blog entry', 'Susan Norton'), (NULL, 1, 'Commenting first blog entry', 'Ros e')
返回首页 返回IT168首页 登录 注册 最新 门户 论坛 新闻 文档 下载 商店 专题 CTO CIO 人才 图书 培训 wiki投稿 频道 Oracle DB2 SQL Server MySQL ERP Java .NET 开源 移动 管理 SOA 测 试 BI SCM 专区 IBM 微软 Oracle WebSphere 互动 空间 blog 圈子 IXPUB 社区 数据库技术 信息化 开发技术 项目管理 IBM软件技术 微软 专区 CUDA编程技术 移动开发
DROP TABLE IF EXISTS `test`.`blogs`; CREATE TABLE `test`.`blogs` ( `id` INT(10) UNSIGNED AUTO_INCREMENT, `title` TEXT, `content` TEXT, `author` VARCHAR(45) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
相关阅读:
史上最全的MYSQL备份方法 从MySQL 5.5发布看开源数据库新模式 MySQL创建者全球请愿 欲阻甲骨文收购
上一页1 2 3下一页 查看全文 【内容导航】
第1页:在更新数据库时使用外键约束
返回首页 返回IT168首页 登录 注册 最新 门户 论坛 新闻 文档 下载 商店 专题 CTO CIO 人才 图书 培训 wiki投稿 频道 Oracle DB2 SQL Server MySQL ERP Java .NET 开源 移动 管理 SOA 测 试 BI SCM 专区 IBM 微软 Oracle WebSphere 互动 空间 blog 圈子 IXPUB 社区 数据库技术 信息化 开发技术 项目管理 IBM软件技术 微软 专区 CUDA编程技术 移动开发