有在這些情況下,一些成熟的DBMS一句MERGE
。 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 ...
某些DBMS像MySQL有自己的語法有同樣的想法。 查看更多的Wikipedia。
如果您的DBMS沒有soppurt,那麼您可以使用相同的邏輯編寫一個存儲過程。
但是,在插入代碼之前,存儲過程或任何其他類型的其他檢查都會導致「滯後」,並且操作將變爲「非原子」。這意味着可能在檢查之後和插入之前,另一個事務可以創建重複記錄,並且會得到意外的重複或異常。爲了避免這種情況,您必須在執行此操作之前鎖定表格,以便獲得對錶格的獨佔訪問權限,因爲訪問的序列化會導致懲罰性損失。
或者你可以使用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
)
但你知道它不會更新任何內容。
http://stackoverflow.com/q/108403/284240 – 2012-04-26 14:11:03