2013-07-15 125 views
0

我只是對某事感到好奇。讓我們說我有一個表,我將更新值,然後將其刪除,然後插入一個新的1。這將是非常容易的,如果我寫這樣的方式編碼:SQL更新,刪除並同時插入

UPDATE PS_EMAIL_ADDRESSES SET PREF_EMAIL_FLAG='N' WHERE EMPLID IN ('K0G004'); 

    DELETE FROM PS_EMAIL_ADDRESSES WHERE EMPLID='K0G004' AND E_ADDR_TYPE='BUSN'; 

    INSERT INTO PS_EMAIL_ADDRESSES VALUES('K0G004', 'BUSN', '[email protected]', 'Y'); 
但是

,這將是更如果使用'update'語句更容易。但我的問題是,這有可能在同一時間完成這3步?

+3

如果您要刪除一行然後刪除一行,實際上與剛纔刪除的行相同,爲什麼不更新現有行呢?目前還不清楚爲什麼你想同時執行所有3個操作 –

+0

行似乎回來只是修改,不需要運行所有三個,只是做更新,並根據需要進行更新 – mirkobrankovic

+1

@Damien_The_Unbeliever如果它一行是。第二條語句可能會刪除多個(或者根本沒有)行。 –

回答

2
Quoting Oracle Transaction Statements documentation

事務是包含一個或 多個SQL語句工作的邏輯,原子單位。一個事務對SQL語句進行分組,使得它們全部被提交,這意味着它們被應用於 數據庫,或者全部回滾,這意味着它們從 數據庫中撤消。 Oracle數據庫爲每個事務分配一個稱爲事務ID的唯一 標識符。

此外,quoting wikipedia Transaction post

在計算機科學中,ACID(原子性,一致性,隔離性 耐久性)是一組保證數據庫 事務被可靠地處理性能。

原子性要求每個交易「全有或全無」:如果交易的一個部分 失敗,整個交易失敗,並且 數據庫狀態保持不變。

在你的情況,你可以附上所有三個句子在一個單一的交易:

COMMIT;   ''This statement ends any existing transaction in the session. 
SET TRANSACTION NAME 'my_crazy_update'; ''This statement begins a transaction 
             ''and names it sal_update (optional). 
UPDATE PS_EMAIL_ADDRESSES 
    SET PREF_EMAIL_FLAG='N' 
    WHERE EMPLID IN ('K0G004'); 

DELETE FROM PS_EMAIL_ADDRESSES 
    WHERE EMPLID='K0G004' AND E_ADDR_TYPE='BUSN'; 

INSERT INTO PS_EMAIL_ADDRESSES 
VALUES('K0G004', 'BUSN', '[email protected]', 'Y'); 

COMMIT; 

這是爲了引起你的要求「做所有句子在同一時間」最好的辦法。

+0

嗨danihp交易功能非常令人印象深刻。我可以執行一個簡單的檢查哪一部分失敗?因爲當傳入參數不符合查詢中的參數時,事務函數將停止執行。 – goh6319

0

使用此更新:

UPDATE PS_EMAIL_ADDRESSES 
SET 
PREF_EMAIL_FLAG = 'N', 
E_ADDR_TYPE = 'BUSN', 
`column1_name` = '[email protected]', 
`column2_name` = 'Y' 
WHERE EMPLID = 'K0G004'; 

凡column1_name和column2_name是您使用這些值的列名。

+0

嗨吉米謝謝你的建議,如果我只在1次執行中完成這3步,那有可能嗎? :D – goh6319

+1

如果你真的想一次做3個操作,你可以嘗試這樣的問題:http://stackoverflow.com/questions/14259249/mysql-insert-or-update-if雖然,通過使用我的更新你正在做出你想要的改變。 – Gimmy

+0

yup〜我知道使用update語句可以很快完成它,我只是好奇,可能在1次執行中執行3個不同的步驟。 – goh6319

-1

編寫一個存儲過程來完成所需的所有操作並調用它。這將是一個單一的聲明!

+0

您是否介意更詳細地解釋如何通過更新執行合併語句,刪除並同時插入? – goh6319

+0

我剛剛刪除了那部分。你可以做到這一點,但它會很人造。我已經編輯它建議你只寫一個程序。 – LoztInSpace