插入Informix表或更新(如果存在)

时间:2016-04-28 14:18:33

标签: sql informix

我想在 Informix 数据库表中添加一行,但是当存在具有相同唯一键的行时,我想更新该行。

我找到了MySQL here的解决方案,如下所示,但我需要 Informix

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

2 个答案:

答案 0 :(得分: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

Informix有一些有趣的规则允许使用关键字作为标识符,而不需要双引号(实际上,除非你在环境中设置了DELIMIDENT,否则双引号只是字符串单引号的替代方法。)

答案 1 :(得分:5)

您可以使用MERGE语句尝试相同的行为:

示例,创建目标表:

CREATE TABLE target 
(
    id      SERIAL PRIMARY KEY CONSTRAINT pk_tst,
    name    CHAR(1),
    age     SMALLINT
);

创建临时源表并插入所需的记录:

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。

另一种方法是创建一个存储过程,基本上你会执行INSERT语句并检查SQL错误代码,如果它是-100你去UPDATE。 / p>

类似的东西:

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;