2008-12-05 43 views
4

我需要一些SQL來更新數據庫中的記錄,如果它存在,並插入它時,看看周圍看起來對此有幾種解決方案,但我不知道什麼是正確/可接受的方式來做到這一點。什麼是正確/最快的方式來更新/插入一條記錄在SQL(Firebird/MySql)

我理想上喜歡它可以同時在Firebird 2和MySQL 5上運行,因爲更新需要針對兩個數據庫運行,並且如果同時運行的SQL同時運行在兩個數據庫上,會是一個優點。

在這種情況下,速度和可靠性也是影響速度可靠性的因素,但它可能會用於快速連續更新1000條記錄(通過不同的表格)。

是否有任何拒絕?

回答

3

您應該使用這樣的:

BEGIN TRANSACTION 
IF EXISTS (SELECT * FROM the_table WHERE pk = 'whatever') 
    UPDATE the_table SET data = 'stuff' WHERE pk = 'whatever' 
ELSE 
    INSERT INTO the_table (pk, data) VALUES ('whatever', 'stuff') 
COMMIT 

還是這個,但分別給他們,並忽略有關違反主鍵約束從插入任何錯誤:

INSERT INTO the_table (pk, data) VALUES ('whatever', 'stuff') 

UPDATE the_table SET data = 'stuff' WHERE pk = 'whatever' 
0

更換作品酷似INSERT,但如果舊的行在表中與PRIMARY KEY或UNIQUE索引的新行具有相同的值時,舊行在插入新行之前被刪除。

語法:

REPLACE [LOW_PRIORITY |延遲] [INTO] tbl_name [(COL_NAME,...)]

{ VALUES | VALUE} 

({expr | DEFAULT},...),(...),... 

鑑於:它與約束工作時,最好避免更換。

0

我已經在MySQL中使用INSERT更新行:
INSERT INTO table() VALUES() ON DUPLICATE KEY UPDATE key
但是,您不能使用自動生成的密鑰。

6

在Firebird 2.1中,您可以對簡單情況使用UPDATE OR INSERT,對於更復雜的情況可以使用MERGE

1

在火鳥2.1之前,您可以使用此取巧的辦法:

insert into table (id, a, b, c) values (:id, :a, :b, :c) 
when SQLCODE -803 
do 
begin 
    update table set a = :a, b = :b, c = :c where id = :id; 
end; 
相關問題