先来奠定全文的感情基调: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就是个智障。