请问一下,mysql有没有instead of触发器的写法?
或者使用触发器实现唯一性索引的功能,尽可能对并发性影响小
=============================
在百度上搜到如下例子:
1 CREATE TRIGGER t_insert_tabName 2 ON table_name 3 instead of INSERT 4 AS 5 DECLARE @columnvalue INT 6 SET @columnValue= 7 (SELECT columnValue FROM inserted) 8 IF EXISTS(SELECT * FROM table_name WHERE columnName=@columnValue) 9 ROLLBACK 10 ELSE 11 INSERT INTO table_name SELECT * FROM inserted
但是我执行的时候会报语法错误,而且是在on那个地方
首先表示本人提出的问题简直漏洞百出不忍直视......
因为MySQL中的触发器只有before/after两种类型,表的别名也是使用old/new来表示的,触发器只支持行级触发,而不支持语句级触发。另外,我上面贴出来的百度上的例子其实是在sqlserver中可以实现的。
MySQL的例子自己写了一个,实现的功能是禁止insert
1 DELIMITER $$ 2 CREATE TRIGGER tri_name AFTER INSERT ON table_name 3 FOR EACH ROW BEGIN 4 DELETE FROM table_name WHERE id=new.id; 5 END$$ 6 DELIMITER ; 7 8 #tri_name 是触发器的命名,可以随意 9 #table_name 是触发器的执行是基于哪张表
但是关于MySQL触发器实现唯一性索引的功能暂时只有思路,还未实现
思路如下:
1 DELIMITER $$ 2 CREATE TRIGGER tri_test BEFORE INSERT ON `test_2` 3 FOR EACH ROW 4 BEGIN 5 SET @count = 6 (SELECT COUNT(1) FROM test_2 WHERE unique_col=new.unique_col); 7 IF @count = 0 8 THEN 9 INSERT INTO test_2(id,unique_col) VALUES (new.id,new.unique_col); 10 END IF; 11 12 END$$ 13 DELIMITER ; 14 15 #唯一性索引的字段为unique_col,在insert之前,设定参数count来获取new.unique_col与test_2 表中的unique_col相等的where;若为0,则insert。
但是目前test_2表中涉及的数据太多,尚未实现唯一性索引的功能