首页 新闻 搜索 专区 学院

MySQL触发器instead of的写法/唯一性索引实现

0
悬赏园豆:5 [已解决问题] 解决于 2018-01-03 11:14

请问一下,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那个地方

Kid_Zora的主页 Kid_Zora | 菜鸟二级 | 园豆:208
提问于:2017-12-21 17:04
< >
分享
最佳答案
0

首先表示本人提出的问题简直漏洞百出不忍直视......

因为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表中涉及的数据太多,尚未实现唯一性索引的功能

Kid_Zora | 菜鸟二级 |园豆:208 | 2017-12-25 11:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册