2016-04-28 15 views
2

Informixデータベーステーブルに行を追加したいが、同じユニークキーを持つ行が存在する場合は、その行を更新したい。次のようにInformixテーブルに挿入するか、存在する場合は更新する

は私があるのMySQL hereのためのソリューションを見つけたが、私は、Informixのためにそれを必要とする:

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE name="A", age=19 

答えて

9

おそらく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のは、確かに(二重引用符を必要とすることなく、識別子としてのキーワードの使用を可能に興味深いルールを持っています環境では、二重引用符は単に文字列の一重引用符の代わりに使用されます)。

+0

素晴らしい解決策。ただし、挿入/更新する値のいずれかがnullの場合、 "null AS columnName"が使用されているとInformix 11.7はシステムエラーを生成します。これを回避するには、 "nvl(null、null)as columnName"を使用します。また、私はFROM sysmasterを使用しなければなりませんでした:informix.sysdual(informixを引用符で囲まないでください) –

+0

現時点ではテストできませんが、NULL :: INTEGER(列の型を使用)を試してみてください。それがうまくいかなければ、私は実験をしなければならない。 –

5

あなたは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; 
関連する問題