mysql 触发器 随机数_mysql 触发器如何优化速度

这篇博客探讨了MySQL触发器的使用,特别是在处理更新和插入操作时的优化问题。作者分享了一段示例代码,展示了如何在触发器中生成不重复的随机数,以避免主键冲突。此外,还讨论了在多线程环境下,如何利用LAST_INSERT_ID()函数正确获取自增ID。博客中还包含了关于同步插入到多个表的触发器问题的讨论,以及来自不同用户提供的解决方案。
摘要由CSDN通过智能技术生成

实际开发发现 @变量是不支持 作为比较的

BEGIN

declare localid int;

set localid=new.id;

if localid>0 then

insert b(a,b,c) values(localid,localid,localid);

end if;

END

其他

mysql> delimiter //

mysql> create trigger mytrigger after update on bill

for each row

begin

DECLARE billId,reivewID,shopID,productID int ;

if(bill.status == 2 && bill.ctobreview_id == NULL && datediff(bill.nowdate,now())>15)

begin

set billId = bill.id;

--select id into billId from bill where status = 2 and ctobreview = null;

SELECT product_id into productID from billitem where bill_id = billId;

select shop_id into shopID from product where shop_id = productID;

insert into ctobReview values(2,null,null,10,10,10,10,shopID);

-- select @reviewID from inserted;

select last_insert_id();

update bill set ctobreview_id = reviewID where id = billId;

end

end ;

这次任务加深了对 MySQL trigger & procedure的了解。拷贝代码做一个记录~~~

其中一张表的触发器代码:

create trigger SetPiUnderId BEFORE INSERT on t_play_item

for each ROW

begin

DECLARE uid int;

declare usedNum int;

declare retry int;

declare maxRetry int;

SELECT max(pi_under_id)+1 into uid from t_play_item;

IF uid = 0

then

set uid = 1;

end if;

IF uid < 65535 THEN

-- UPDATE t_play_item set pi_under_id = pi_id where pi_id = new.pi_id;

set NEW.pi_under_id = uid;

else

begin

-- 否则开始生成随机数查询

set maxRetry = 65530;

set retry = 0;

REPEAT

set uid = RAND() * 65530; [Page]

set usedNum = 0;

-- 有几条记录使用这个编号

select count(*) into usedNum from t_play_item where pi_under_id = uid;

set retry = retry + 1;

until usedNum = 0 or retry >= maxRetry

end repeat;

IF  usedNum = 0

then

-- UPDATE t_play_item set pi_under_id = uid where pi_id = new.pi_id;

set NEW.pi_under_id = uid;

else

-- 强制设置成id, 没有找到抛出错误的办法,

set NEW.pi_under_id = uid;

-- UPDATE t_play_item set pi_under_id = pi_id where pi_id = new.pi_id;

-- UPDATE t_play_item set pi_under_id = 65535 where pi_id = new.pi_id;

end if;

end;

end if; [Page]

end

用来测试的存储过程:

CREATE PROCEDURE TestSetPiUnderId(in times int, in showMsg bool)

MODIFIES SQL DATA

begin

declare t int;

set t = 0;

REPEAT

set t = t + 1;

insert into t_play_item(pi_style, pi_rect_no, pi_sent, pi_des) values(t, 1, 0, ’’);

IF showMsg then

select CONCAT(’插入成功第’, CAST(t as char));

end if;

until t> times

end repeat;

mysql触发器问题

我需要把一些数据直接导入dedecms里

但他的文章是分两个表存放的

麻烦帮写个触发器当

insert into dede_archives(typeid,description)values(1,内容数据)

时同步的

insert into dede_addonarticle(id,typeid,body)values(值1,值2,值3)

其中值1也就是id是表dede_archives的id(这个是自增的),值2等于dede_archives中的typeid,值3等于dede_archives中的description

因为我的采集器只支持一条语句,所以只能通过这个方法来实现~

麻烦给出该触发器的语法

这是一篇来自百度知道的问题

一捅姜姗

乞丐

UID 328066

精华 0

积分 -74

帖子 0

威望 -37

ZD币 6 元

阅读权限 0

注册 2008-5-20

状态 离线   沙发 使用商品  发表于 2008-7-25 01:01  资料  个人空间  短消息  加为好友

mysql触发器问题

[此问题的推荐答案]

楼上的写的都SQL Server支持的语法

MySQL中不是这样写滴

如下:

CREATE TRIGGER trg_Table1

AFTER insert ON `Table1`

FOR EACH ROW

BEGIN

INSERT INTO dede_addonarticle(id,typeid,body)

SELECT id,typeid,description

FROM dede_archives

WHERE id=LAST_INSERT_ID()

END;

在这里最麻烦的是取得自增量最后插入的值,根据MySQL的官方说明,是使用LAST_INSERT_ID()这个函数,LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变。

一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的。

但在多线程情况下,就不行了。在多用户交替插入数据的情况下max(id)显然不能用。

这就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update操作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。

用MySQL命令行测试,结果是正确的,但是使用MySQL Query Browser测试时,LAST_INSERT_ID返回了全部的id值。可能是软件的问题,跟MySQL无关。

另外,如果你有一次有多行记录插入时,LAST_INSERT_ID只返回第1个,

例如:

INSERT INTO dede_archives(typeid,description)

VALUES (222, 'Mary') , (333, 'Jane') , (444, 'Lisa');

一次插入3行记录,假设此时生成的id是4,5,6三个,但是用LAST_INSERT_ID只能返回4

因此,对于批量插入时的处理,你要结合使用ROW_COUNT()来判断插入的记录数

INSERT INTO dede_addonarticle(id,typeid,body)

SELECT id,typeid,description

FROM dede_archives

WHERE id>=LAST_INSERT_ID()

AND id <=LAST_INSERT_ID()+ROW_COUNT()

我没有测试过,你自己测试一下再说,基本上应该没问题

这是一篇来自百度知道的问题

咬不动的狗不理

乞丐

UID 328071

精华 1

积分 -123

帖子 0

威望 -64

ZD币 4 元

阅读权限 0

注册 2008-5-20

状态 离线   板凳 使用商品  发表于 2008-7-25 01:01  资料  个人空间  短消息  加为好友

mysql触发器问题

s="ianswer"> 其他回答    共 5 条

create trigger tr_table

on dede_archives

for insert

as

insert into dede_archives(id,typeid,body) select id,typeid,description from inserted

回答者:wangjie_02 - 江湖新秀 四级 7-23 19:36

这是一篇来自百度知道的问题

hata_nannan

乞丐

UID 328083

精华 2

积分 -114

帖子 0

威望 -62

ZD币 7 元

阅读权限 0

注册 2008-5-20

状态 离线   地毯 使用商品  发表于 2008-7-25 01:01  资料  个人空间  短消息  加为好友

mysql触发器问题

a>

CREATE trigger dede_archives_add on dede_archives

after insert

as

declare @typeid int

declare @count

set @typeid = (select bh from inserted)

select @count =count(*) from dede_addonarticle where typeid = @typeid

if @count = 0

insert into dede_addonaritcle(id,typeid,description) select id,typeid,body from inserted

回答者:feng5354 - 江湖新秀 五级 7-23 19:50

这是一篇来自百度知道的问题

cayenne0627

乞丐

UID 328438

精华 0

积分 -128

帖子 0

威望 -64

ZD币 2 元

阅读权限 0

注册 2008-5-21

状态 离线   第5楼 使用商品  发表于 2008-7-25 01:01  资料  个人空间  短消息  加为好友

mysql触发器问题

a>

declare @typeid int

declare @count

set @typeid = (select bh from inserted)

select @count =count(*) from dede_addonarticle where typeid = @typeid

if @count = 0

insert into dede_addonaritcle(id,typeid,description) select id,typeid,body from inserted

回答者:剑张 - 秀才 二级 7-23 20:52

这是一篇来自百度知道的问题

我爱夏天添

乞丐

UID 328167

精华 0

积分 -104

帖子 0

威望 -52

ZD币 5 元

阅读权限 0

注册 2008-5-20

状态 离线   第6楼 使用商品  发表于 2008-7-25 01:01  资料  个人空间  短消息  加为好友

mysql触发器问题

a>

create trigger tr_table

on dede_archives

for insert

as

insert into dede_addonarticle(id,typeid,body) select id,typeid,description from inserted

一楼的insert表的时候错了

create trigger tr_table --建立一个触发器,并命名

on dede_archives --哪个表

for insert --执行什么操作的时候

as

insert into dede_addonarticle(id,typeid,body) --插入到哪个表

select id,typeid,description --插入什么数据

from inserted --这个其实是sql的临时表的机制

另外id是自增的就有问题了

dede_addonarticle可以不让这个表自增

不然你逻辑上都说不过去,就别提程序上了

回答者:山顶与山脚 - 经理 五级 7-23 23:53

这是一篇来自百度知道的问题

我喷火烧死你

乞丐

UID 328080

精华 0

积分 -120

帖子 0

威望 -60

ZD币 3 元

阅读权限 0

注册 2008-5-20

状态 离线   第7楼 使用商品  发表于 2008-7-25 01:01  资料  个人空间  短消息  加为好友

mysql触发器问题

a>

create trigger tr_table

on dede_archives

for insert

as

if not exists(select 1 from dede_addonarticle where id in (select id from inserted ))

begin

insert into dede_addonarticle(id,typeid,body)

select id,typeid,description from inserted

end

本贴来自ZDNetChina中文社区 http://bbs.zdnet.com.cn ,本贴地址:http://bbs.zdnet.com.cn/viewthread.php?tid=547063

[本帖最后由 liyihongcug 于 2009-5-15 10:23 编辑]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值