概述
Mysql数据库使用触发器实现获取当前Insert数据的ID值
在开发过程中,遇到了保存记录网页上列表显示顺序的问题,且这个顺序页面上是可以修改的。如下图所示:
那么问题来了,如何实现记录顺序呢?
我采用了最简单的方法,就是在数据库中添加了一个字段,叫做xx_order,int类型就不用说了,但是问题又来了,每次Insert一条数据后,我该如何记录当前的数据的order?
于是在网上四处搜索,了解到如下结论:
1. 数据库中可以使用默认自增的形式为此数据添加顺序,但是Mysql数据库(目前只接触了Mysql数据库)并不支持两列数据的自增长,也就是说,如果主键使用了自增长,那这样的想法就不必继续了。
2. 可以采用触发器实现获取当前Insert语句的ID值,然后使得_order的值等于这个id值,就可以记录顺序了。
3. 在创建Insert触发器的时候,必须使用Before,且新增的一行数据就叫做new,比如new.order就表示本次Inser的表中的order字段名。
4.由于使用了Before,就意味着在Insert之前获取该数据的id,但是此时sql还没有提交,所以无论采用哪种方式获取,得到的结果都是0,这一点非常重要!
5. 获取当前行的ID,网上可以搜出大致的几种方法,如:使用LAST_INSERT_ID()函数、使用@@IDENTITY、使用IDEN_CURRENT(tablename)、使用SCOPE_IDENTITY()或COPE_IDENTITY,但是请注意:SCOPE_IDENTITY()以及COPE_IDENTITY在Mysql中使用的时候都会显示如下错误(list是数据表的名称,出现这样的问题可能是由于我确实没有学过数据库,用法不对,有大佬看见了还望指正说明一下~)
第二点的思路是正确的,但是这其中确实有很多坑:
1. 关于LAST_INSERT_ID():LAST_INSERT_ID()为最后插入的ID值,这个ID值与表无关,也就是说,在a表中Insert了一条数据,又在b表中Insert了一条数据,最后得到的是b表中的ID。所以这样的数据就存在了不确定性,一旦多个表中都写了Insert触发器,那最后得到的ID,鬼都不知道是啥了。
2. 关于==@@IDENTITY==:@@IDENTITY表示最近一次向数据库中储存的具有自增特性的属性(也就是ID了),我试过,在Mysql中这个属性是可以使用的,但是,它也是全局的,表示当前会话的所有作用域中的任何表最后生成的标识值,也就是说我想获取当前表的ID然后用来当做我的order。
3. 关于取到数据是0的:之前也解释了,是因为在获取当前ID时,用的触发器是Before,数据库还没有提交,所以得到的就是0了
4. 关于实现记录顺序的问题:其实到现在我才明白说了都是一堆废话,因为想记录顺序,主键又是INT类型的,那直接用ID当做顺序不就好了吗?为何要整这些花里胡哨的。用户修改了顺序,就将修改的数据的ID值互换不就好了吗?不过,数据库的ID最好还是不要随意修改,因为它真的非常重要,尤其是做了别的表的外键!!!
下面不扯废话了,来说说我是如何使用触发器实现了获取ID,并将其保存为order的。
(好吧,多说一句,我习惯使用Navicat数据库可视化工具,有现成的工具,一直用一直爽啊)
- 首先,我用一张test表来做测试,表中只有三个字段,test_id,test_name,test_order;如下图(需要注意的是test_order千万不要设置自增,因为数据库只支持一列数据的自增,虽然网上有各种帖子说是支持的,但是我摸索了很久,最终都是不可以的。):
- 写触发器
- 说sql代码
BEGIN
SET new.test_order = IF((select COUNT(*) from test) = 0,1,(select test_id from test order by test_id desc limit 1) + 1);
END
其实,想了太多还不如用数据库本身去查询,用了太多种方法却不如简简单单的sql,有一种“众里寻他千百度,蓦然回首,那人却在灯火阑珊处”的感觉。
在这里,我其实只是将需要用到的表中的最大ID取出来,然后+1,就是下一条数据的ID了。还是那句话,我获取当前Insert的ID总是为0,那干脆获取上一条数据的id,再做处理好了。于是就这样变相的获取到了当前表当前Insert语句的ID值。
需要说明的一点是,在查询最大ID的时候慎用MAX()函数,据说这个函数弄不好就会将数据库中的所有ID遍历一遍,而用户不停地在前端交换位置,数据库则需要不断的在后面遍历,一旦数据量大起来…是不是很可怕!所以建议用order by column desc (降序排列)
或order by column asc (升序排列)
,但为获取最大值,所以我用的是降序排列,然后limit 1
,就将这个值拿到了。
4. 数据测试
好了,今天就分享到这里了,有不对的地方还请大家指正~
最后
以上就是俭朴纸飞机为你收集整理的【触发器】数据库如何记录页面显示数据?Mysql如何获取当前Insert的ID值呢?Mysql数据库使用触发器实现获取当前Insert数据的ID值的全部内容,希望文章能够帮你解决【触发器】数据库如何记录页面显示数据?Mysql如何获取当前Insert的ID值呢?Mysql数据库使用触发器实现获取当前Insert数据的ID值所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复