MySQL排坑1 简单的触发器

先来奠定全文的感情基调:MySQL真是神坑!

自从把MySQL Workbench安装两遍才安成功那天开始,我就知道我与它之间只能是一段孽缘。之前我一直用SQL server,从没遇到过这么多大大小小莫名其妙的问题,今天就让我用几篇博文把我遇到的问题一一列出。

一开始我的需求是防止插入重复数据。我在MySQL中建了一个表,表的结构大概是三列:id, 列1, 列2。建表时我脑抽加了一个贼没用的自增列主键id,而我真正需要的是列1和列2一起是不重复的,其实当初建表时就应该给它俩搞成联合主键的。于是懒懒的不想改表结构的我开始了一下午的探索之路。

最先想的办法是写一个触发器。然额一开始写出来的触发器总是报奇怪的语法错误,在网上几经辗转,终于发现,要前后加delimiter把建触发器的语句套起来才行:

delimiter //
create trigger t1
before insert on lookup
for each row
begin
declare num int;
select count(*) into num from lookup
where words=new.words and hs=new.hs;
if num>0 then 
insert into mytable values (1);
end if;
end //
delimiter ;

 对,就很气,必须平白无故加这么个奇奇怪怪的东西才能好用。

先前if语句中我按原先在SQL server中的习惯写了rollback,谁曾想执行起来还是报错,后来发现似乎MySQL的触发器中不能有commit、rollback这样的语句???蛤?得知这个消息的我大跌眼镜,如此一来要触发器还有何用?

后来在博客上看到有大神用一个猥琐方法解决了这个问题,就是在原本想rollback的地方写一个会执行出错误的语句,来强行中断语句的进行。在此跪拜大神。

于是我先写了这些:

create table mytable(
id int not null,
primary key (id)
);

insert into mytable values (1);

然后我在触发器中写的那个insert语句就会利用主键约束来打断语句的执行,真是棒棒的呢!

不信就来测试一下。先正常插入一条记录:

insert into lookup (words,hs) values ('one',1);

插入成功了。再插入一条这两列值一模一样的:

insert into lookup (words,hs) values ('one',1);

这次就插入失败了,报的错是Error Code: 1062. Duplicate entry '1' for key 'PRIMARY',就是mytable违反了主键约束,真真是叫人无发可脱呢。

以后我还是去学学Oracle之类的,MySQL就是个智障。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值