作用

實例

-- 如果沒有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 語句來實現類似的功能。
  • 對於簡單的插入或更新操作,每種數據庫都有其特定的最佳實踐和語句。選擇哪種方法取決於你的具體需求和偏好。

...很懶,先記錄後面再寫