重複チェック用の単純な SQL (トリガー) が必要です。私のテーブル名はtest1
2列でcode
、sname
. 新しいレコードを挿入する前に、レコードが既に存在するかどうかを確認してください。存在する場合はエラーを生成し、挿入しません。そうでない場合は、挿入を続行します。
それ、どうやったら出来るの?
テーブルに重複データがないことを確認するための最も簡単で信頼性の高い方法は、トリガーをまったく使用せず、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インフォメーション・センターにあります。