我想要一个简单的SQL(触发器)来进行重复检查。
我的表名为test1
,有两列,code
和sname
。在插入新记录之前,检查记录是否已存在:如果已存在,则生成错误并且不插入;如果没有,请让插入继续。
我该怎么做?
答案 0 :(得分:1)
确保表中没有重复数据的最简单,最可靠的方法是根本不使用触发器,而是使用UNIQUE或PRIMARY KEY约束:
CREATE TABLE test1
(
code INTEGER NOT NULL PRIMARY KEY,
sname VARCHAR(32) NOT NULL UNIQUE
);
四个约束(两个NOT NULL,一个PRIMARY KEY,一个UNIQUE)自动确保没有重复的记录插入表中。
如果您选择添加触发器,则会复制这些约束所完成的工作。
至于如何操作,您需要创建一个从触发器语句调用的存储过程。它将被赋予新代码和新名称,并将执行SELECT以查看是否发生任何匹配记录,并且如果出现则将引发异常,否则不会引发异常。
CREATE PROCEDURE trig_insert_test1(ncode INTEGER, nname VARCHAR(32))
DEFINE ocode INTEGER;
FOREACH SELECT code INTO ocode
FROM test1
WHERE code = ncode OR sname = nname
RAISE EXCEPTION -271, -100, "Value to be inserted already exists in table test1";
END FOREACH;
END PROCEDURE
然后你使用:
CREATE TRIGGER ins_test1 INSERT ON test1
REFERENCING NEW AS NEW
FOR EACH ROW (EXECUTE PROCEDURE ins_trig_test1(new.code, new.sname))
在Informix 4GL中,您既可以创建包含这些语句的字符串,也可以创建PREPARE和EXECUTE(以及FREE),也可以使用SQL块:
SQL
CREATE TRIGGER ins_test1 INSERT ON test1
REFERENCING NEW AS NEW
FOR EACH ROW (EXECUTE PROCEDURE ins_trig_test1(new.code, new.sname))
END SQL
但是,正如我在开始时所说的那样,使用触发器并不是最好的方法;根据表格定义,它是多余的。
我没有通过服务器运行任何SQL或SPL;你需要检查分号是否在SPL中的正确位置,因为SPL对此很挑剔。
您可以在Informix 11.70 Information Centre中找到SQL和SPL语句的语法。