1

重複チェック用の単純な SQL (トリガー) が必要です。私のテーブル名はtest12列でcodesname. 新しいレコードを挿入する前に、レコードが既に存在するかどうかを確認してください。存在する場合はエラーを生成し、挿入しません。そうでない場合は、挿入を続行します。

それ、どうやったら出来るの?

4

1 に答える 1

1

テーブルに重複データがないことを確認するための最も簡単で信頼性の高い方法は、トリガーをまったく使用せず、UNIQUEまたはPRIMARYKEY制約を使用することです。

CREATE TABLE test1
(
    code    INTEGER NOT NULL PRIMARY KEY,
    sname   VARCHAR(32) NOT NULL UNIQUE
);

4つの制約(2つのNOT NULL、1つのPRIMARY KEY、1つの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の適切な場所にあることを確認する必要があります。

SQLおよびSPLステートメントの構文は、Informix11.70インフォメーション・センターにあります。

于 2012-08-13T01:31:03.810 に答える