插入 Informix table 或更新(如果存在)
Insert into a Informix table or update if exists
我想向 Informix 数据库 table 添加一行,但是当存在具有相同唯一键的行时,我想更新该行。
我找到了 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 target
(
id SERIAL PRIMARY KEY CONSTRAINT pk_tst,
name CHAR(1),
age SMALLINT
);
创建临时源table并插入您想要的记录:
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
.
类似于:
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;
您可能应该使用 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,否则双引号只是字符串周围单引号的替代方法)。
我想向 Informix 数据库 table 添加一行,但是当存在具有相同唯一键的行时,我想更新该行。
我找到了 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 target
(
id SERIAL PRIMARY KEY CONSTRAINT pk_tst,
name CHAR(1),
age SMALLINT
);
创建临时源table并插入您想要的记录:
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
.
类似于:
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;
您可能应该使用 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,否则双引号只是字符串周围单引号的替代方法)。