MERGE
在几个成熟的 DBMS 中
有一句话就是针对这些情况的。MERGE
是INSERT
和UPDATE
同时。
一般语法示例:
MERGE INTO TABLE_NAME USING table_reference ON (condition)
WHEN MATCHED THEN
UPDATE SET column1 = value1 [, column2 = value2 ...]
WHEN NOT MATCHED THEN
INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...
一些像 MySQL 这样的 DBMS 有自己的语法和相同的想法。在维基百科中查看更多信息。
如果您的 DBMS 不支持,那么您可以编写具有相同逻辑的存储过程。
但是在插入之前存储过程或任何其他类型的代码检查都会产生“滞后”,并且操作将变为“非原子”。这意味着在您的检查之后和插入之前,另一笔交易可能会产生重复记录,您将获得意外的重复或异常。为避免这种情况,您必须在此操作之前锁定表以获得对表的独占访问,因为访问的序列化会导致性能损失。
或者你可以像这样INSERT
使用SELECT
:
INSERT (field1, ...) INTO table1
SELECT value1, ...
FROM DUAL -- put a name of analogue of Oracle's DUAL here
WHERE NOT EXISTS (
SELECT 1
FROM table1
WHERE key = :new_key
)
但如您所知,它不会更新任何内容。