2013-07-15 4 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 присваивает каждой транзакции уникальный идентификатор , называемый идентификатором транзакции.

Также 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

Hi danihp очень впечатляет от транзакции. Могу ли я выполнить простую проверку того, какая часть не работает? Поскольку функция транзакции прекратит выполнение, если параметр pass in не соответствует параметру в запросе. – goh6319

0

Используйте этот UPDATE:

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

Привет, Химми, спасибо за ваше предложение. Это возможно, если я сделал это только 3 шага только в 1 исполнении? : D – goh6319

+1

Если вы действительно хотите сделать 3 операции за один раз, вы можете попробовать что-то вроде этого вопроса: http://stackoverflow.com/questions/14259249/mysql-insert-or-update-if Хотя, используя мое обновление вы делаете необходимые изменения. – Gimmy

+0

yup ~ Я знал, что использование оператора обновлений может сделать это быстро, я просто интересуюсь тем, что можно выполнить 3 разных шага только в 1 исполнении. – goh6319

-1

Напишите хранимую процедуру для выполнения всех операций, которые вы хотите, и позвоните им. Это будет одно заявление!

+0

Не могли бы вы более подробно объяснить, как выполнять оператор слияния путем обновления, удалять и вставлять одновременно? – goh6319

+0

Я только что снял эту часть. Вы могли бы это сделать, но это было бы очень надуманно. Я отредактировал его, чтобы предложить вам просто написать процедуру. – LoztInSpace

Смежные вопросы