图书类别表如下:

+------+

| bkn  |

+------+

| 健康 |

| 军事 |

| 医药 |

| 哲学 |

| 小说 |

| 政治 |

| 教育 |

| 散文 |

| 科幻 |

| 童话 |

| 经济 |

| 美食 |

+------+

图书表里面有很多这些类别的书,图书表中图书类别的外键是图书类别表的图书类别。

我想做一个触发器,在我更改图书类别前,(因为外键约束,改哪个表的类别都是不行的),能够自动向图书类别表增加要改成的那个新类别,改完之后,再把旧类别从图书类别表中删去。

就这么点问题,却遇到了莫名其妙的错误。

DELIMITER $

CREATE TRIGGER change_bk

BEFORE UPDATE

ON b FOR EACH ROW

BEGIN

insert into bkind values(new.bk);

END$

mysql> update b set bk = '医学' where bk = '医药'$

ERROR 1062 (23000): Duplicate entry '医学' for key 'PRIMARY'

我好像明白了,b表里有不止一条要改的记录,他每次都要执行一遍插入操作,所以。。。

做了个测试,真的是这样。

mysql> insert into bkind values('lala');

-> $

Query OK, 1 row affected (0.03 sec)

mysql> insert into b values('1', '1', 'lala', '1', 1, 1, '1', '1', '1');

-> $

Query OK, 1 row affected (0.03 sec)

mysql> update b set bk = 'la' where bk = 'lala'$

Query OK, 1 row affected (0.03 sec)

Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from bkind;

-> $

+------+

| bkn  |

+------+

| la   |

| lala |

插进来了!!!

哇哇哇!!!就在几秒前,我终于把标题最前面的待解决三个字去掉了!!!

血汗泪啊!!!

DELIMITER $

CREATE TRIGGER change_bk

BEFORE UPDATE

ON b FOR EACH ROW

BEGINif(new.bk not in (selectbknfrombkind))

then

insert into bkind values(new.bk);

endif;

END$

mysql> update b set bk = 'hj' where bk = '医药'$

Query OK, 2 rows affected (0.04 sec)

Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from b where bk = 'hj';

-> $

+---------------+----------------------+------+-------+----------+------+--------+-----------------------+-------------+

| isbn          | bn                   | bk   | bs    | maxstore | rest | author | publisher             | publishdate |

+---------------+----------------------+------+-------+----------+------+--------+-----------------------+-------------+

| 9787502581091 | 医药学基础           | hj   |  正常 |        3 |    2 |  戴敏  |  化学工业出版社发行部 |  2006-3     |

| 9787806621950 | 中国苗族药物彩色图集 | hj   | 报废  |        3 |    3 | 汪毅   | 贵州科技出版社        | 2002-1      |

+---------------+----------------------+------+-------+----------+------

————————————感谢坚持解决问题的自己——————————————————————————————

整理:

mysql> update b set bk = '医学' where bk = '医药'$

Query OK, 2 rows affected (0.04 sec)

Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from b where bk = '医学'$

+---------------+----------------------+------+-------+----------+------+--------+-----------------------+-------------+

| isbn          | bn                   | bk   | bs    | maxstore | rest | author | publisher             | publishdate |

+---------------+----------------------+------+-------+----------+------+--------+-----------------------+-------------+

| 9787502581091 | 医药学基础           | 医学 |  正常 |        3 |    2 |  戴敏  |  化学工业出版社发行部 |  2006-3     |

| 9787806621950 | 中国苗族药物彩色图集 | 医学 | 报废  |        3 |    3 | 汪毅   | 贵州科技出版社        | 2002-1      |

+---------------+----------------------+------+-------+----------+------+--------+-----------------------+-------------+

2 rows in set (0.00 sec)

mysql> select * from bkind;

-> $

+------+

| bkn  |

+------+

| la   |

| lala |

| 健康 |

| 军事 |

| 医学 |

| 哲学 |

| 小说 |

| 政治 |

| 教育 |

| 散文 |

| 科幻 |

| 童话 |

| 经济 |

| 美食 |

+------+

14 rows in set (0.00 sec)

完整代码:

DELIMITER $

CREATE TRIGGER change_bk

BEFORE UPDATE

ON b FOR EACH ROW

BEGINif(new.bk not in (selectbknfrombkind))

then

insert into bkind values(new.bk);

endif;

END$

DELIMITER $

CREATE TRIGGER change_bk1

AFTER UPDATE

ON b FOR EACH ROW

BEGINif(old.bk not in (selectbkfromb))

then

deletefrom bkind where bkn =old.bk;

endif;

END$

总结:问题是不难,找对路是关键。

MySQL触发器的题_mysql触发器问题相关推荐

  1. mysql创建删除触发器的时候_mysql触发器简介及如何创建和删除触发器

    什么是mysql触发器 需要MySQL 5 对触发器的支持是在MySQL 5中增加的.因此,本章内容适用于MySQL 5或之后的版本. MySQL语句在需要时被执行,存储过程也是如此.但是,如果你想要 ...

  2. mysql库表的触发器表名_MySQL 触发器,实现不同数据库,不同表名,表结构不同,数据实时同步...

    创建触发器: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt ...

  3. mysql触发器应用场景_MySQL触发器的使用场景及方法实例

    触发器: 触发器的使用场景以及相应版本: 触发器可以使用的MySQL版本: 版本:MySQL5以上 使用场景例子: 每当增加一个顾客到某个数据库表时,都检查其电话号码格式是否正确,州的缩写是否为大写 ...

  4. mysql触发器访问网站_MySQL触发器使用-WEB资讯专栏-DMOZ中文网站分类目录-免费收录各类优秀网站的中文网站目录....

    触发器:触发器的使用场景以及相应版本:触发器可以使用的MySQL版本:- 版本:MySQL5以上### 使用场景例子:1. 每当增加一个顾客到某个数据库表时,都检查其每当增加一个顾客到某个数据库表时, ...

  5. mysql触发器实验小结_mysql 触发器小结

    触发器可以监视某种数据操作(insert/update/delete) 并触发(insert/update/delete)( 创建触发器4要素 监视地点 -----监视事件----触发时间----触发 ...

  6. mysql触发器如果提示_mysql 触发器

    1   引言Mysql的触发器和存储过程一样,都是嵌入到mysql的一段程序.触发器是mysql5新增的功能,目前线上凤巢系统.北斗系统以及哥伦布系统使用的数据库均是mysql5.0.45版本,很多程 ...

  7. mysql触发器错误信息_MySQL 触发器错误_MySQL

    bitsCN.com 使用Spring jdbctemplate时出错: view sourceprint?01 org.springframework.jdbc.UncategorizedSQLEx ...

  8. mysql触发器 while循环_mysql触发器跳出当前循环方法

    mysql触发器跳出当前循环方法 set @num=@UnitLength/3; label: while i set @length=(select SUBSTRING(@unit_sid_fk,1 ...

  9. mysql 触发器 注意事项_MySQL触发器的利弊-使用MySQL触发器时应该注意的事项

    在MySQL中,触发器可以在你执行INSERT.UPDATE或DELETE的时候,执行一些特定的操作.在创建触发器时,可以指定是在执行SQL语句之前或是之后执行这些操作.通过触发器,你可以实现一些业务 ...

最新文章

  1. 讲解JS的promise,这篇是专业认真的!
  2. 扩增子图表解读5火山图:差异OTU数量及变化规律
  3. raster java_Raster
  4. CentOS-7-64bit 配置Apache + MySQL + PHP
  5. 2021全州高中高考成绩查询,最新!最全!桂林各中学高考成绩汇总!为桂林考生骄傲!...
  6. 硬RAID可以为NVMe SSD数据可靠性保驾护航吗?
  7. IOS第七天(2:UiTableView 加上数据分离)
  8. PAT乙类1005之继续(3n+1)猜想 (25 分)
  9. antd form rules字数限制_Package - antd-form-rules
  10. java jexl_一种表达式语言的解析引擎JEXL简单使用
  11. python批量复制文件夹下所有文件_python定时复制远程文件夹中所有文件
  12. 工具 | 2的次方对照表
  13. NOIP模拟 位运算(trie树+按位贪心)
  14. 基于51单片机MAX31865的PT100铂电阻测温设计
  15. 无线承载根据承载的内容不同分为SRB和DRB EPS承载根据用户业务需求和Qos的不同可以分为GBR/ Non-GBR 承载...
  16. Linux内核设计与实现 第17章 设备与模块
  17. WPF界面工具Telerik UI for WPF入门级教程 - 设置一个主题(二)
  18. Qt 免注册版本下载
  19. 阿拉伯数字和汉字对照表
  20. 使用python有趣地解决一道动态币值规划方案

热门文章

  1. 进化材料基因:机器学习如何推动下一代新材料的发现
  2. word2019插入MathType公式行距变大解决
  3. Python爬虫入门基础
  4. dlna移植android系统,基于Android的DLNA互动视频系统的设计与实现
  5. 三星i9308刷机笔记
  6. [附源码]计算机毕业设计JAVA乒乓球俱乐部管理系统
  7. ArcGIS给栅格数据建立属性表
  8. Archicad二次开发——创建墙、梁、柱等元素
  9. [附源码]JAVA+ssm基于JAVA的校园电车租赁系统(程序+Lw)
  10. Azure Database for Mysql 还原操作,还原表,还原库,还原一切