精华内容
下载资源
问答
  • 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;
    

    这样再删除数据就会把所有相关的语句都删除了。

    更多相关内容
  • -> // +----+---------+--------+ | 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触发器:当改变(增、删、改)数据表的记录时,绑定在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返回的结果消息里面会提示出你删除的记录

    f68f2add0b68e4f9810432fce46917b7.png

    本文原创发布php中文网,转载请注明出处,感谢您的尊重!

    展开全文
  • 级联删除:将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表!

    展开全文
  • 我创建了两个非常简单的表作为完整性检查,并且无法让它们执行级联删除,因此需要一些帮助.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触发器之创建多个触发器操作。分享给大家供大家参考,具体如下: 这次记录的内容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,以保持数据...
  • 需求:现在想要实现删除主表,然后评论表内容也跟着级联删除 2.我们的评论表如下,有很多主表公用一个评论表,用commenttype区分 3.写触发器: 声明一个变量DECLARE c VARCHAR(32);, 然后设置值SET c = ...
  • 于是第二种方法出现了: 通过触发器级联删除: 具体的触发器代码如下: Create TRIGGER [dbo].[DeleteRelatedProducts] ON [dbo].[ProductCategory] AFTER DELETE AS BEGIN SET NOCOUNT ON; delete from [dbo]....
  • 目前mysql 5.* 版本在级联删除时不会执行delete触发器,当外键级联删除后没有启动触发器可能会产生一些垃圾数据,这些垃圾数据可能因为某些原因(性能或并发控制)而创建了该表,例如设计一个统计表,当某表新增或...
  • 主要介绍了MySQL使用外键实现级联删除与更新的方法,详细分析了mysql数据库与表的创建、数据插入、查询以及外链的使用与级联操作相关技巧,需要的朋友可以参考下
  • 触发器级联删除

    2020-05-30 15:40:48
    想要删除订单表order_的时候同时删除订单表下的所有订单明细 写了一个触发器 但是deleted识别不出来 DELETE orderitem FROM orderitem WHERE order_id IN (SELECT order_id FROM deleted) 出现这样的错误...
  • 级联删除:将stu表中id为2的学生删除,该学生在sc表中的成绩也会级联删除 delete from stu where sid = '2'; 级联更新:stu表中id为3的学生更改为id为6,该学生在sc表中的对应id也会级联更新 update stu set sid=6 ...
  • 触发器(Trigger)的起源MySQL是最受欢迎的开源RDBMS,被社区和企业广泛使用。触发器MySQL在5.0.1(开天辟地一版本)中增加的三大新功能之一,另外两个师兄弟是视图(view)与存储过程(procedure)。均属于相对“高级”...
  • Mysql中创建触发器通过SQL语句CREATE TRIGGER来实现,其语法形式如下: CREATE trigger trigger_name BEFORE|AFTER trigger_EVENT ontable_name for EACH ORW trigger_STMT 参数trigger_name表示创建触发器
  • SQl语句的级联删除问题删除应该有顺序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_...
  • 软件安装:装机软件必备包SQL是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。在使用它时,只需要发出...UPDATE触发器UPDATE 触发器在 UPDATE...
  • 带有外键的相关行可能会被删除(如果您使用级联外键),否则可能会阻止REPLACE。 触发的触发器DELETE不需要执行。 副作用也传播到副本。 修正:既REPLACE和INSERT...ON DUPLICATE KEY UPDATE是非标准的,私有的发明...
  • MySQL触发器的作用 二、触发器语法 1. 创建语法四要素 2. 语法公式 3. 语法参数说明 4. NEW 与 OLD关键字详解 三、实际应用 1. 数据准备 2. 使用案例 # Insert触发器 – 级联插入 # Delete触发器 – 级联删除 # ...
  • MySQL触发器详解

    千次阅读 2021-12-21 23:19:11
    今天继续给大家介绍MySQL相关知识,本文主要内容是MySQL触发器相关知识。 一、触发器简介 触发器是一种特殊的存储过程,在定义触发器时会定义触发器的触发条件,使得触发器在满足触发条件时自动执行而不需要认为调用...
  • 创 建 一 个 触 发 器 , 当 删 除 某 学 号 的 学 生 时 , 把 他 的 选 课 记 录 级 联 删 除 。 表结构: 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触发器简单实例 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:24
    MySQL 触发器 一、触发器介绍 触发器,其实是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上...当向学生表中 添加 / 修改 / 删除 学生信息时,使用触发器自动进行日志记录。
  • 触发器是基于行触发的, 所以删除、 新增或者修改操作可能都会激活触发器, 不要编写过于复杂的触发器, 也不要增加过得的触发器, 这样会对数据的插入、 修改或者删除带来比较严重的影响, 同时也会带来可移植性差...
  • mysql级联删除多表数据 方法1:通过sql删除(注意:关联两表删除可用,关联多表用不了) delete table1,table2 from table1,table2 where table1.id=table2.id and table1.id=#{id} 方法2:通过设置外键级联删除 方法...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,524
精华内容 2,209
关键字:

mysql触发器级联删除

mysql 订阅