SQL Update,同时删除和插入

时间:2013-07-15 06:24:15

标签: sql oracle-sqldeveloper

我只是对某事感到好奇。假设我有一个表格,我将更新该值,然后删除它然后插入一个新的1.如果我以这样的方式编写代码将非常容易:

  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', 'ABS@GNC.COM.BZ', 'Y');

但是,如果使用'update'语句会更容易。但我的问题是,可能在同一时间完成了这3个步骤吗?

3 个答案:

答案 0 :(得分:2)

Quoting Oracle Transaction Statements documentation

  

交易是一个逻辑的,原子工作单元,其中包含一个或   更多SQL语句。事务将SQL语句分组以便它们   要么都已提交,这意味着它们都应用于   数据库,或所有回滚,这意味着他们从中撤消   数据库。 Oracle数据库为每个事务分配唯一的事务   标识符称为事务ID。

另外,quoting wikipedia Transaction post

  

在计算机科学中,ACID(原子性,一致性,隔离,   Durability)是一组保证数据库的属性   交易得到可靠处理。

     

原子性要求每笔交易“全有或全无”:如果有的话   部分事务失败,整个事务失败,并且   数据库状态保持不变。

在您的情况下,您可以将所有三个句子都包含在一个交易中:

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', 'ABS@GNC.COM.BZ', 'Y');

COMMIT;

这是满足您的要求的最佳方法'一次完成所有句子'

答案 1 :(得分:0)

使用此更新:

UPDATE PS_EMAIL_ADDRESSES
SET
PREF_EMAIL_FLAG = 'N',
E_ADDR_TYPE = 'BUSN',
`column1_name` = 'ABS@SEMBMARINE.COM.SG',
`column2_name` = 'Y'
WHERE EMPLID = 'K0G004';

其中column1_name和column2_name是您用于这些值的列名。

答案 2 :(得分:-1)

编写存储过程以执行所需的所有操作并调用它。那将是一个单一的陈述!