我想在 Informix 数据库表中添加一行,但是当存在具有相同唯一键的行时,我想更新该行。
我找到了MySQL here的解决方案,如下所示,但我需要 Informix :
INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE name="A", age=19
答案 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;