Informixデータベーステーブルに行を追加したいが、同じユニークキーを持つ行が存在する場合は、その行を更新したい。次のようにInformixテーブルに挿入するか、存在する場合は更新する
は私があるのMySQL hereのためのソリューションを見つけたが、私は、Informixのためにそれを必要とする:
INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE name="A", age=19
Informixデータベーステーブルに行を追加したいが、同じユニークキーを持つ行が存在する場合は、その行を更新したい。次のようにInformixテーブルに挿入するか、存在する場合は更新する
は私があるのMySQL hereのためのソリューションを見つけたが、私は、Informixのためにそれを必要とする:
INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE name="A", age=19
おそらくMERGEステートメントを使用する必要があります。
適しtable
を考える:
create table table (id serial not null primary key, name varchar(20) not null, age integer not null);
このSQL作品:
MERGE INTO table AS dst
USING (SELECT 1 AS id, 'A' AS name, 19 AS age
FROM sysmaster:'informix'.sysdual
) AS src
ON dst.id = src.id
WHEN NOT MATCHED THEN INSERT (dst.id, dst.name, dst.age)
VALUES (src.id, src.name, src.age)
WHEN MATCHED THEN UPDATE SET dst.name = src.name, dst.age = src.age
あなたはDELIMIDENTを設定している場合を除きInformixのは、確かに(二重引用符を必要とすることなく、識別子としてのキーワードの使用を可能に興味深いルールを持っています環境では、二重引用符は単に文字列の一重引用符の代わりに使用されます)。
あなたはMERGEステートメントを使用して同じ動作を試すことができます。
例、作成のターゲットテーブル:
CREATE TABLE target
(
id SERIAL PRIMARY KEY CONSTRAINT pk_tst,
name CHAR(1),
age SMALLINT
);
一時的なソーステーブルを作成し、 ERTあなたがするレコード:
CREATE TEMP TABLE source
(
id INT,
name CHAR(1),
age SMALLINT
) WITH NO LOG;
INSERT INTO source (id, name, age) VALUES (1, 'A', 19);
MERGEは次のようになります。
MERGE INTO target AS t
USING source AS s ON t.id = s.id
WHEN MATCHED THEN
UPDATE
SET t.name = s.name, t.age = s.age
WHEN NOT MATCHED THEN
INSERT (id, name, age)
VALUES (s.id, s.name, s.age);
あなたはレコードがすることができますその後、挿入されたことがわかります:
UPDATE source
SET age = 20
WHERE id = 1;
そして再びMERGEをテスト。
ストアドプロシージャを作成する別の方法は、ステートメントを実行し、SQLエラーコードを確認します。-100
の場合はUPDATE
です。以下のような
何か:
CREATE PROCEDURE sp_insrt_target(v_id INT, v_name CHAR(1), v_age SMALLINT)
ON EXCEPTION IN (-100)
UPDATE target
SET name = v_name, age = v_age
WHERE id = v_id;
END EXCEPTION
INSERT INTO target VALUES (v_id, v_name, v_age);
END PROCEDURE;
素晴らしい解決策。ただし、挿入/更新する値のいずれかがnullの場合、 "null AS columnName"が使用されているとInformix 11.7はシステムエラーを生成します。これを回避するには、 "nvl(null、null)as columnName"を使用します。また、私はFROM sysmasterを使用しなければなりませんでした:informix.sysdual(informixを引用符で囲まないでください) –
現時点ではテストできませんが、NULL :: INTEGER(列の型を使用)を試してみてください。それがうまくいかなければ、私は実験をしなければならない。 –