我想要一个用于重复检查的简单 SQL(触发器)。我的表名test1
有 2 列,code
并且sname
. 在插入新记录之前,检查记录是否已经存在:如果存在,则产生错误,不插入;如果没有,让插入继续。
我怎么做?
确保表中没有重复数据的最简单、最可靠的方法是根本不使用触发器,而是使用 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 中,您可以创建包含这些语句的字符串,然后准备和执行(和免费)它们,或者您可以使用 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 Center中找到 SQL 和 SPL 语句的语法。