2013-07-15 216 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