-
2017-08-10 12:01:33
由于外键的原因,不能删除表中的一条记录。可以用触发器来实现删除。
CREATE TRIGGER trigger_name BEFORE DELETE ON table1_name FOR EACH ROW BEGIN DELETE FROM table2_name WHERE table2_id = OLD.id; END;
“trigger_name”是触发器的名字(自己定义);
“table1_name”是建立该触发器的表。也就是要执行删除语句的表。
“table2_name”是触发器关联的表。即要级联删除的表。
“BEGIN END”关键词中间执行 删除的级联表中数据语句,多条语句用“;”间隔。
“old.”是关键字。代表级联表中的外键字段(具体删除哪条数据)。DELEETE FROM table1_name WHERE table1_id=30;
这样再删除数据就会把所有相关的语句都删除了。
更多相关内容 -
MySQL写触发器,级联删除
2021-01-18 20:37:23-> // +----+---------+--------+ | id | main_id | value | +----+---------+--------+ | 2 | 2 | TWOTWO | +----+---------+--------+ 1 row in set (0.00 sec) 如果你非要使用触发器来处理, ...展开全部
我就不造你的 学生表和e5a48de588b662616964757a686964616f31333332623432成绩表了.
用 test_main 表 和 test_sub 代替说明-- 创建测试主表. ID 是主键.
CREATE TABLE test_main (
id INT NOT NULL,
value VARCHAR(10),
PRIMARY KEY(id)
);
-- 创建测试子表.
CREATE TABLE test_sub (
id INT NOT NULL,
main_id INT ,
value VARCHAR(10),
PRIMARY KEY(id)
);
-- 插入测试主表数据.
INSERT INTO test_main(id, value) VALUES (1, 'ONE');
INSERT INTO test_main(id, value) VALUES (2, 'TWO');
-- 插入测试子表数据.
INSERT INTO test_sub(id, main_id, value) VALUES (1, 1, 'ONEONE');
INSERT INTO test_sub(id, main_id, value) VALUES (2, 2, 'TWOTWO');
通过 DELETE CASCADE 外键约束的处理机制来处理mysql> ALTER TABLE test_sub
-> ADD CONSTRAINT main_id_cons
-> FOREIGN KEY (main_id)
-> REFERENCES test_main(id)
-> ON DELETE CASCADE//
Query OK, 2 rows affected (0.16 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> DELETE FROM
-> test_main
-> WHERE
-> id = 1;
-> //
Query OK, 1 row affected (0.02 sec)
mysql> SELECT
-> *
-> FROM
-> test_sub;
-> //
+----+---------+--------+
| id | main_id | value |
+----+---------+--------+
| 2 | 2 | TWOTWO |
+----+---------+--------+
1 row in set (0.00 sec)
如果你非要使用触发器来处理, 那么下面是一个例子:-- 创建测试主表. ID 是主键.
CREATE TABLE t_test_main (
id INT NOT NULL,
value VARCHAR(10),
PRIMARY KEY(id)
);
-- 创建测试子表.
CREATE TABLE t_test_sub (
id INT NOT NULL,
main_id INT ,
value VARCHAR(10),
PRIMARY KEY(id)
);
-- 插入测试主表数据.
INSERT INTO t_test_main(id, value) VALUES (1, 'ONE');
INSERT INTO t_test_main(id, value) VALUES (2, 'TWO');
-- 插入测试子表数据.
INSERT INTO t_test_sub(id, main_id, value) VALUES (1, 1, 'ONEONE');
INSERT INTO t_test_sub(id, main_id, value) VALUES (2, 2, 'TWOTWO');
DELIMITER //
CREATE TRIGGER tr_t_test_main_Del
BEFORE DELETE ON t_test_main
FOR EACH ROW
BEGIN
DELETE FROM t_test_sub WHERE main_id = OLD.id;
END;
//
DELIMITER ;
mysql> delete from t_test_main where id = 1;
Query OK, 1 row affected (0.01 sec)
mysql> select * from t_test_sub;
+----+---------+--------+
| id | main_id | value |
+----+---------+--------+
| 2 | 2 | TWOTWO |
+----+---------+--------+
1 row in set (0.00 sec)
-
SQL触发器删除级联记录实现方法
2021-01-28 07:13:09SQL触发器:当改变(增、删、改)数据表的记录时,绑定在SQL语句(增、删、改)中的触发器能够触发某些事件或者函数,所以我们可以在触发器中编写一些处理语句。比如,当我们删除新闻类别的时候,由于外键的原因,我们...SQL触发器:当改变(增、删、改)数据表的记录时,绑定在SQL语句(增、删、改)中的触发器能够触发某些事件或者函数,所以我们可以在触发器中编写一些处理语句。
比如,当我们删除新闻类别的时候,由于外键的原因,我们无法删除新闻类别下有新闻内容的记录,但是通过,我们就可以实现。
代码如下
复制代码
delete from category where id=5 --sql删除语句
create trigger trigcategorydelete --当执行sql删除语句时,执行触发器
on category
after delete
as
begin
delete news where caId=( id from deleted) --删除对应新闻类别的新闻内容
end
照一般的思维,这样就可以同时删除新闻类别和其下的新闻内容,但是这样执行却不成功。是因为关键字AFTER,AFTER表示在执行SQL删除语句后,再执行触发器里的语句。这样一来,顺序同样是先删除新闻再删除新闻内容,肯定不成功。
改变关键字after为instead of
instead of,表示代替delete操作,而没有真正delete from category where id=5,当category表的删除时,同时触发了trigcategorydelete触发器,但是由于有instead of关键字,所以本身并不执行删除操作,而是执行触发器里的sql语句,从而可以替代之前的SQL语句。比如:
代码如下
复制代码
create trigger trigcategorydelete
on category
instead of delete
as
begin
declare @id int --定义一个变量id
select @id=id from deleted --从deleted临时表中,赋值id给变量@id
delete news where caId=@id --先删除该类别下的所有新闻
delete category where id=@id --然后删除新闻类别
end
当我们执行 delete from category where id=5时,id=5的类别并没有真正删除,而是转而执行触发器里面的SQL语句
关于deleted表:
Deleted表用于存储 DELETE 和 UPDATE 语句所影响的行的复本。在执行 DELETE 或 UPDATE语句时,行从触发器表中删除,并传输到deleted表中。Deleted表和触发器表通常没有相同的行。(//最后一句不是怎么明白啊?) by google
删除一条记录时候,他会把删除的这条记录放在一张临时表里,当你对category表进行删除时,在SQL返回的结果消息里面会提示出你删除的记录
本文原创发布php中文网,转载请注明出处,感谢您的尊重!
-
mysql实现级联操作(级联更新、级联删除)
2021-10-16 20:35:55级联删除:将stu表中id为2的学生删除,该学生在sc表中的成绩也会级联删除 delete from stu where sid = '2'; 级联更新:stu表中id为3的学生更改为id为6,该学生在sc表中的对应id也会级联更新 update stu set sid=6 ...一、首先创建两张表stu,sc
create table stu( sid int UNSIGNED primary key auto_increment, name varchar(20) not null) TYPE=InnoDB charset=utf8; create table sc( scid int UNSIGNED primary key auto_increment, sid int UNSIGNED not null, score varchar(20) default '0', index (sid), --外键必须加索引 FOREIGN KEY (sid) REFERENCES stu(sid) ON DELETE CASCADE ON UPDATE CASCADE) TYPE=InnoDB charset=utf8;
--说明: 外键必须建立索引;
FOREIGN key(sid) 设置外键,把sid设为外键
REFERENCES stu(sid) 引用作用。引用stu表中的sid
ON DELETE CASCADE 级联删除
ON UPDATE CASCADE 级联更新二、向两张表插入数据
insert into stu (name) value ('zxf'); insert into stu (name) value ('ls'); insert into stu (name) value ('zs'); insert into stu (name) value ('ww'); insert into sc(sid,score) values ('1','98'); insert into sc(sid,score) values ('1','98'); insert into sc(sid,score) values ('2','34'); insert into sc(sid,score) values ('2','98'); insert into sc(sid,score) values ('2','98'); insert into sc(sid,score) values ('3','56'); insert into sc(sid,score) values ('4','78'); insert into sc(sid,score) values ('4','98');
注意:在sc表中插入数据时,若插入的sid为22,则会插入失败,违反外键约束,因为外键sid
来自stu表中的id的主键,即stu中的id没有等于22的数据。级联删除:将stu表中id为2的学生删除,该学生在sc表中的成绩也会级联删除
delete from stu where sid = '2';
级联更新:stu表中id为3的学生更改为id为6,该学生在sc表中的对应id也会级联更新update stu set sid=6 where sid='3';
注意
删除表的时候必须先删除外键表(sc),再删除主键表(stu)
上图为违反外键约束,不能删除
上图为正常删除,先删除sc表,再删除stu表!
-
MySQL外键级联删除不起作用,完全难倒
2021-03-15 21:14:23我创建了两个非常简单的表作为完整性检查,并且无法让它们执行级联删除,因此需要一些帮助.CREATE TABLE `test1` (`test1_ID` int(11) NOT NULL AUTO_INCREMENT,`test1_name` char(15) DEFAULT NULL,PRIMARY KEY (`... -
用触发器来实现级联更新级联删除
2021-01-27 03:05:52/*用触发器来实现级联更新级联删除*/--创建学生表,课程表,学生课程表--http://www.yaosansi.com/post/692.html范本:触发器方式:create trigger trg_Aon Afor update,deleteasbeginif exists(select 1 from ... -
mysql触发器之创建多个触发器操作实例分析
2020-12-15 01:40:14本文实例讲述了mysql触发器之创建多个触发器操作。分享给大家供大家参考,具体如下: 这次记录的内容mysql 版本必须得是5.7.2+的哈,之前的会不好使的。废话不多说,咱们开始正文哈。 在mysql 5.7.2+版本之前,我们... -
触发器完成级联删除
2020-09-20 16:15:42环境:Navicat for MySQL 一.AFTER触发器 (1)在Lineitem表上定义一个update触发器,当修改订单明细(即修改订单明细 Lineitem价格extendedprice,折扣discount,税率tax自动修改订单Orders的TotalPrice,以保持数据... -
JN项目-触发器级联删除
2017-11-10 16:22:19需求:现在想要实现删除主表,然后评论表内容也跟着级联删除 2.我们的评论表如下,有很多主表公用一个评论表,用commenttype区分 3.写触发器: 声明一个变量DECLARE c VARCHAR(32);, 然后设置值SET c = ... -
MySQL外键设置 级联删除
2020-12-24 09:56:37于是第二种方法出现了: 通过触发器来级联删除: 具体的触发器代码如下: Create TRIGGER [dbo].[DeleteRelatedProducts] ON [dbo].[ProductCategory] AFTER DELETE AS BEGIN SET NOCOUNT ON; delete from [dbo].... -
解决mysql级联删除时不会启动delete触发器
2015-12-23 16:25:54目前mysql 5.* 版本在级联删除时不会执行delete触发器,当外键级联删除后没有启动触发器可能会产生一些垃圾数据,这些垃圾数据可能因为某些原因(性能或并发控制)而创建了该表,例如设计一个统计表,当某表新增或... -
MySQL使用外键实现级联删除与更新的方法
2020-09-10 01:59:47主要介绍了MySQL使用外键实现级联删除与更新的方法,详细分析了mysql数据库与表的创建、数据插入、查询以及外链的使用与级联操作相关技巧,需要的朋友可以参考下 -
触发器级联删除
2020-05-30 15:40:48想要删除订单表order_的时候同时删除订单表下的所有订单明细 写了一个触发器 但是deleted识别不出来 DELETE orderitem FROM orderitem WHERE order_id IN (SELECT order_id FROM deleted) 出现这样的错误... -
Mysql实现级联操作(级联更新、级联删除)
2020-05-13 12:25:01级联删除:将stu表中id为2的学生删除,该学生在sc表中的成绩也会级联删除 delete from stu where sid = '2'; 级联更新:stu表中id为3的学生更改为id为6,该学生在sc表中的对应id也会级联更新 update stu set sid=6 ... -
mysql级联删除_MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目
2020-10-24 07:57:47触发器(Trigger)的起源MySQL是最受欢迎的开源RDBMS,被社区和企业广泛使用。触发器是MySQL在5.0.1(开天辟地一版本)中增加的三大新功能之一,另外两个师兄弟是视图(view)与存储过程(procedure)。均属于相对“高级”... -
Mysql触发器的使用,创建,修改和删除
2021-07-26 10:37:22在Mysql中创建触发器通过SQL语句CREATE TRIGGER来实现,其语法形式如下: CREATE trigger trigger_name BEFORE|AFTER trigger_EVENT ontable_name for EACH ORW trigger_STMT 参数trigger_name表示创建触发器 -
级联删除sql语句-数据库级联删除语句-sql删除语句
2021-01-28 00:38:06SQl语句的级联删除问题删除应该有顺序1,删除link表delete from ref,link where ref.link_code=link.link_code and link_id=?delete from link where link_id=?2,删除plan表delete from ref,plan where ref.plan_... -
MySQL UPDATE触发器(更新)及触发器深度解析
2021-01-27 11:01:29软件安装:装机软件必备包SQL是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。在使用它时,只需要发出...UPDATE触发器UPDATE 触发器在 UPDATE... -
MySQL外键约束,级联删除
2020-12-24 09:56:03带有外键的相关行可能会被删除(如果您使用级联外键),否则可能会阻止REPLACE。 触发的触发器DELETE不需要执行。 副作用也传播到副本。 修正:既REPLACE和INSERT...ON DUPLICATE KEY UPDATE是非标准的,私有的发明... -
MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目
2020-12-14 13:50:55MySQL触发器的作用 二、触发器语法 1. 创建语法四要素 2. 语法公式 3. 语法参数说明 4. NEW 与 OLD关键字详解 三、实际应用 1. 数据准备 2. 使用案例 # Insert触发器 – 级联插入 # Delete触发器 – 级联删除 # ... -
MySQL触发器详解
2021-12-21 23:19:11今天继续给大家介绍MySQL相关知识,本文主要内容是MySQL触发器相关知识。 一、触发器简介 触发器是一种特殊的存储过程,在定义触发器时会定义触发器的触发条件,使得触发器在满足触发条件时自动执行而不需要认为调用... -
触发器中的级联删除什么意思
2022-04-28 12:34:28创 建 一 个 触 发 器 , 当 删 除 某 学 号 的 学 生 时 , 把 他 的 选 课 记 录 级 联 删 除 。 表结构: student表包括sno,sname,sdept score表包括sno,cno,grade 其中的级联删除该怎么解决? -
MySQL 触发器详解
2021-11-08 12:54:45触发器 一、触发器的介绍 ...在MySQL,只有执⾏insert\delete\update操作才能触发触发器的执⾏。 二、 触发器使用 1.创建触发器 create trigger tri_name -- tri_name:触发器别名 <before|after> -
Mysql触发器
2021-01-25 10:36:05触发器是一种特殊类型的存储过程,它不同于存储过程,主要是通过事件触发而被执行的,即不是主动调用而执行的;而存储过程则需要主动调用其名字执行 触发器:trigger,是指事先为某张表绑定一段代码,当表中的某些... -
在sqlyog中创建MySQL触发器简单实例
2021-10-06 09:18:59在sqlyog中创建MySQL触发器简单实例 DELIMITER $$ USE `smartshoppingsystem`$$ DROP TRIGGER /*!50032 IF EXISTS */ `updateGoods`$$ CREATE TRIGGER `updateGoods` AFTER INSERT ON `business` FOR EACH ROW... -
MySQL 触发器
2021-12-27 20:22:24MySQL 触发器 一、触发器介绍 触发器,其实是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上...当向学生表中 添加 / 修改 / 删除 学生信息时,使用触发器自动进行日志记录。 -
MySQL触发器介绍及使用
2021-03-29 16:34:27触发器是基于行触发的, 所以删除、 新增或者修改操作可能都会激活触发器, 不要编写过于复杂的触发器, 也不要增加过得的触发器, 这样会对数据的插入、 修改或者删除带来比较严重的影响, 同时也会带来可移植性差... -
mysql数据库级联删除多表数据
2019-12-25 13:16:56mysql级联删除多表数据 方法1:通过sql删除(注意:关联两表删除可用,关联多表用不了) delete table1,table2 from table1,table2 where table1.id=table2.id and table1.id=#{id} 方法2:通过设置外键级联删除 方法...