Informix 4GL和触发器

时间:2012-08-10 16:37:28

标签: informix 4gl

我想要一个简单的SQL(触发器)来进行重复检查。 我的表名为test1,有两列,codesname。在插入新记录之前,检查记录是否已存在:如果已存在,则生成错误并且不插入;如果没有,请让插入继续。

我该怎么做?

1 个答案:

答案 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语句的语法。