Mysql的:ON DUPLICATE KEY UPDATE
作用
实例
-- 如果没有id=0的,就用values中的值
-- 如果有id=0的,就更新成 ON DUPLICATE KEY UPDATE 后面的字段的值
INSERT INTO t_02 (id, name, descc)
VALUES (0, '新人', '新描述')
ON DUPLICATE KEY UPDATE name = 'xiugaiName', descc = 'xiugaiDescc';
sqlserver、oracle、postgresql不支持
在 SQL Server、Oracle 和 PostgreSQL 中处理插入时遇到唯一键或主键冲突的逻辑有所不同。每种数据库系统都提供了自己的机制来处理这种冲突。
SQL Server
在 SQL Server 中,你可以使用 MERGE 语句或者 INSERT INTO ... SELECT 结合 NOT EXISTS 来实现类似的功能。但是,如果你只是想简单地更新已存在的记录或在不存在时插入新记录,可以使用 MERGE 语句或者更简单的方法使用 INSERT 结合 ON DUPLICATE KEY UPDATE 语法的等效物。
使用 MERGE 语句:
MERGE INTO YourTable AS target
USING (VALUES (value1, value2, ...)) AS source (column1, column2, ...)
ON target.primary_key = source.column1
WHEN MATCHED THEN
UPDATE SET target.column2 = source.column2, ...
WHEN NOT MATCHED THEN
INSERT (column1, column2, ...) VALUES (source.column1, source.column2, ...);
使用 INSERT 和 SELECT:
IF NOT EXISTS (SELECT 1 FROM YourTable WHERE primary_key = @value)
BEGIN
INSERT INTO YourTable (column1, column2, ...) VALUES (@value1, @value2, ...);
END;
ELSE
BEGIN
UPDATE YourTable SET column2 = @value2 WHERE primary_key = @value;
END;
Oracle
在 Oracle 中,可以使用 MERGE INTO 语句来处理插入或更新操作。这是最直接对应于其他数据库中 ON DUPLICATE KEY UPDATE 的方法。
MERGE INTO YourTable target
USING (SELECT value1 AS column1, value2 AS column2 FROM dual) source
ON (target.primary_key = source.column1)
WHEN MATCHED THEN
UPDATE SET target.column2 = source.column2
WHEN NOT MATCHED THEN
INSERT (column1, column2) VALUES (source.column1, source.column2);
PostgreSQL
在 PostgreSQL 中,可以使用 ON CONFLICT 子句来实现类似的功能。这是 PostgreSQL 特有的语法,用于处理唯一性约束冲突。
INSERT INTO YourTable (column1, column2) VALUES (value1, value2)
ON CONFLICT (primary_key) DO UPDATE SET column2 = EXCLUDED.column2;
这里,EXCLUDED 是一个特殊的表,包含了尝试插入的行的值。如果存在冲突(即违反了唯一性约束),则执行 UPDATE 操作。
总结
- SQL Server 和 PostgreSQL 都提供了直接的方式来处理插入时遇到的唯一键冲突,分别是使用
MERGE和ON CONFLICT。 - Oracle 使用
MERGE INTO语句来实现类似的功能。 - 对于简单的插入或更新操作,每种数据库都有其特定的最佳实践和语句。选择哪种方法取决于你的具体需求和偏好。
浙公网安备 33010602011771号