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, ...);

使用 INSERTSELECT:

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 都提供了直接的方式来处理插入时遇到的唯一键冲突,分别是使用 MERGEON CONFLICT
  • Oracle 使用 MERGE INTO 语句来实现类似的功能。
  • 对于简单的插入或更新操作,每种数据库都有其特定的最佳实践和语句。选择哪种方法取决于你的具体需求和偏好。

...很懒,先记录后面再写

posted on 2025-12-01 17:05  C_C_菜园  阅读(0)  评论(0)    收藏  举报

导航