数据库 Navicat for MySQL 换种思维解决插入同时更新数据

这篇文章是我的学生在实际项目中遇到的一个案例,在对某张表插入数据过程中,某些特定的字段需也要进行更新,比如说部门编号在前端插入,而部门名称在插入时应该自动更新,如果前端设置选择编号又选择部门就重复功能了,那么数据库怎么实现呢?
        最早学生想通过触发器实现,设置一个插入触发器,插入的同时更新数据,但是问题来了,在同一张表中,触发器是不能同时插入又更新的。这篇文章主要讨论这个问题的解决方法。同时为了加深大家对触发器的映像,也会在给大家讲述些触发器的知识,起到讨论的作用。
        希望文章对你有所帮助,尤其是我的学生和数据库基础的博友以及解决实际项目中的类似问题。如果文章中存在错误或不足之处,还请海涵~
        推荐前文:
        [数据库] Navicat for MySQL触发器更新和插入操作
        [数据库] Navicat for MySQL事件Event实现数据每日定期操作


一. 触发器问题

        现在存在两张表。第一张表为部门表department,核心字段为unit(学院名称)、depid(学院编号),如下图所示:



        第二张表为插入信息表task,depid表示部门编号、source表示部门名称,对应表department表的unit字段。还有插入时间、公告事件等字段,这里省略了。


        现在前端有个按钮,选择部门编号,但是想通过department部门表同时插入部门名称,怎么实现呢?首先,学生想到的是通过触发器,如下所示:

[sql]  view plain  copy
  1. DROP TRIGGER IF EXISTS `upd_info`;    
  2. create trigger upd_info    
  3. after insert on task for each row     
  4. begin    
  5.     update task,department set source = department.unit    
  6.         where task.depid=department.depid;    
  7. end;   
        触发器设置成功。但是当插入数据时,报错如下所示:[Err] 1442 - Can't update table 'task' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.


        注意:该错误表示如果你在触发器里面对刚刚插入的数据进行了 insert/update, 则出现这个问题。因为会造成循环的调用。解决方法通过set设置值。
        参考地址:http://blog.csdn.net/java2000_net/article/details/3857579




二. 触发器解决

        现在修改需要通过set来设置值,我修改如下所示:

[sql]  view plain  copy
  1. DROP TRIGGER IF EXISTS `test`;    
  2. create trigger test    
  3. before insert on task for each row     
  4. begin    
  5.     declare dname varchar(20);  
  6.     select department.unit into dname from department,task   
  7.         where task.depid=department.depid and task.depid=new.depid;  
  8.     set new.source = dname;   
  9. end;   
        其中需要注意几点:
        1.触发器Before和After的区别。
        (1) before(insert、update)可以对new进行修改;
        (2) after不能对new进行修改;
        (3) 两者都不能修改old数据;
        (4) 对于Insert语句,只有new是合法的,对于delete语句,只有old合法,而update可以在new和old同时使用。
        否则,在after insert触发器中使用old,报错如下:
        [Err] 1363 - There is no OLD row in on INSERT trigger
        2.这里使用declare定义变量,并且select a into b把查询结果a赋值到b使用。

        但是运行结果是没有反应,因为查询条件中task.depid=new.depid在before insert触发器中,插入数据前进行查询,其结果是空的;而使用task.depid=old.depid又不能在insert中使用old。
        比如执行下列SQL语句:
[sql]  view plain  copy
  1. insert task (depid) VALUES('1067105002');  
        输出结果如下所示:


        那怎么解决呢?解决方法包括:
        1.后台执行插入语句后,再执行一条Update语句,更新该字段是最方便的操作;
        2.通过Event实时更新单位名称,参考前文:
        [数据库] Navicat for MySQL事件Event实现数据每日定期操作
        但是如果需要通过SQL语句实现呢?那么我想到的是在使用insert插入过程中调用select查询,这就是我说的换个思维解决该问题。


三. 换个思维解决

        SQL语句代码如下:

[sql]  view plain  copy
  1. INSERT INTO task(depid,source)   
  2.     SELECT depid, unit FROM department   
  3.   where department.depid='1067103002';    
        运行结果如下所示,可以看到插入数据成功,其中taskid是自增整型,单位名称添加成功了。后台把'1067103002'换成对应的Java变量即可连接前端插入。


        同样,有些时候需要插入条件判断,如果不存在则插入替代设置唯一性,代码为:

[sql]  view plain  copy
  1. INSERT INTO task(depid)   
  2. SELECT '106710511' FROM DUAL WHERE NOT EXISTS(SELECT depid FROM task WHERE depid = '106710511');  
        参考文章:
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Navicat for MySQL是一款数据库管理工具,可以用来插入数据。具体操作步骤如下: 1. 打开Navicat for MySQL,连接到你的MySQL数据库。 2. 在左侧的导航栏中,选择你要插入数据的表格。 3. 点击“插入记录”按钮,或者右键点击表格,选择“插入记录”。 4. 在弹出的插入记录窗口中,填写要插入数据。 5. 点击“确定”按钮,保存数据。 6. 在表格中查看刚刚插入数据,确认插入成功。 以上就是使用Navicat for MySQL插入数据的步骤。 ### 回答2: Navicat for MySQL是一款非常强大的数据库管理工具,能够完成MySQL的大部分管理任务,其中插入数据是它的一个非常重要的功能。 要使用Navicat for MySQL插入数据,首先需要连接到MySQL数据库,这一步可以在Navicat的主界面中选择“新连接”来完成。在弹出的连接设置窗口中,输入对应的MySQL服务器地址、端口号、用户名和密码,点击“测试连接”按钮测试连接是否成功。如果连接成功,就可以在Navicat中看到MySQL数据库的结构和数据插入数据的方法有多种,具体的方法取决于具体情况。以下是几种常见的插入数据方法: 1. 直接在表格中插入数据:在Navicat的主界面中选择需要插入数据的表格,就可以在右侧看到表格的数据。在需要插入的位置上直接双击,就可以进入编辑模式,输入数据,完成后点击保存即可。 2. 使用SQL命令插入数据:在Navicat的主界面中选择SQL编辑器,就可以输入SQL语句。使用INSERT INTO语句插入数据,格式为INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...)。将table_name替为需要插入数据的表名,column1, column2, column3,...替为表格中需要插入数据的列名,value1, value2, value3,...替为需要插入的具体值,多个值之间用逗号隔开。 3. 使用导入数据功能:在Navicat的主界面中选择需要插入数据的表格,在右侧选择“导入数据”,就可以打开导入数据的窗口。在窗口中选择需要导入的数据文件,点击“导入”按钮即可完成数据插入。 无论使用哪种方法,都需要在插入数据前确保数据的格式正确,并且插入数据符合表格的要求。否则,插入数据可能会失败,或者数据中存在错误。在插入数据后,还需要对数据进行检查,确保数据的正确性,以避免数据的错误对后续操作产生影响。 ### 回答3: Navicat for MySQL是一款功能强大的数据库管理工具。在Navicat插入数据实际上就是向数据库的表中插入数据。下面是详细的步骤: 1. 打开Navicat for MySQL,连接到相应的数据库。 2. 选择要插入数据的表,右键点击该表,选择“打开编辑器”。 3. 在编辑器中,选择“插入记录”图标或者点击菜单栏中的“记录”->“插入记录”。 4. 在弹出的插入记录窗口中,填写要插入的每个字段的值。要注意的是,插入数据类型必须与数据库表中的数据类型相匹配,否则会出现数据类型错误。 5. 填写完毕后,点击“确定”按钮。 6. 插入记录成功后,Navicat会提示“插入记录成功”。 除了通过编辑器插入记录之外,还可以通过执行SQL语句来插入数据。具体步骤如下: 1. 打开Navicat for MySQL,连接到相应的数据库。 2. 在“查询”选项卡中,输入要执行的SQL语句,例如:INSERT INTO table_name (field1, field2, field3) VALUES (value1, value2, value3); 3. 点击“执行”按钮执行SQL语句。 4. 如果SQL语句写的正确,则会提示“执行成功”。 通过Navicat for MySQL插入数据非常简单,只需要选择合适的方式就可以轻松完成。同时,要注意数据类型与数据库表相匹配的问题,以避免数据类型错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值