1

我想要一个用于重复检查的简单 SQL(触发器)。我的表名test1有 2 列,code并且sname. 在插入新记录之前,检查记录是否已经存在:如果存在,则产生错误,不插入;如果没有,让插入继续。

我怎么做?

4

1 回答 1

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 中,您可以创建包含这些语句的字符串,然后准备和执行(和免费)它们,或者您可以使用 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 语句的语法。

于 2012-08-13T01:31:03.810 回答