oracle insert if not exists 语句

Posted

技术标签:

【中文标题】oracle insert if not exists 语句【英文标题】:Oracle insert if not exists statement 【发布时间】:2012-06-05 04:31:44 【问题描述】:
insert into OPT (email, campaign_id) values('mom@cox.net',100)
where not exists( select * from OPT where (email ="mom@cox.net" and campaign_id =100)) ;

错误报告:SQL 错误:ORA-00933:SQL 命令未正确结束 00933. 00000 - “SQL 命令未正确结束” *原因: *行动:

如果Oracle中不存在新行,如何插入?

【问题讨论】:

【参考方案1】:

根据已经存在的另一条记录插入某些内容(在 Oracle 中)的正确方法是使用 MERGE 语句。

请注意,这个问题已经在这里回答了:

oracle insert if row not exists insert if not exists oracle

【讨论】:

【参考方案2】:
insert into OPT (email, campaign_id) 
select 'mom@cox.net',100
from dual
where not exists(select * 
                 from OPT 
                 where (email ='mom@cox.net' and campaign_id =100));

【讨论】:

简单而巧妙的批量插入。谢谢【参考方案3】:
insert into OPT       (email,        campaign_id) 
select 'mom@coxnet' as email, 100 as campaign_id from dual MINUS
select                 email,        campaign_id from OPT;

如果 OPT 中已经有 mom@cox.net/100 的记录,MINUS 将从 select 'mom@coxnet' as email, 100 as campaign_id from dual 记录中减去此记录,并且不会插入任何内容。另一方面,如果没有这样的记录,MINUS 不会减去任何内容,并将插入值 mom@coxnet/100

正如 p.marino 已经指出的那样,merge 可能是解决您的问题的更好(和更正确)的解决方案,因为它是专门为解决您的任务而设计的。

【讨论】:

【参考方案4】:
MERGE INTO OPT
USING
    (SELECT 1 "one" FROM dual) 
ON
    (OPT.email= 'mom@cox.net' and OPT.campaign_id= 100) 
WHEN NOT matched THEN
INSERT (email, campaign_id)
VALUES ('mom@cox.net',100) 
;

【讨论】:

点评来源: 您好,请不要只回答源代码。尝试对您的解决方案如何工作提供一个很好的描述。请参阅:How do I write a good answer?。谢谢【参考方案5】:

另一种方法是利用 oracle 的 INSERT ALL 语法,

INSERT ALL 
    INTO table1(email, campaign_id) VALUES (email, campaign_id)
WITH source_data AS
 (SELECT 'mom@cox.net' email,100 campaign_id
  FROM   dual
  UNION ALL
  SELECT 'dad@cox.com' email,200 campaign_id
  FROM   dual)      
SELECT email
      ,campaign_id
FROM   source_data src
WHERE  NOT EXISTS (SELECT 1
        FROM   table1 dest
        WHERE  src.email = dest.email
        AND    src.campaign_id = dest.campaign_id);

INSERT ALL 还允许我们基于子查询作为源对多个表执行条件插入

有一些非常干净和很好的例子可供参考。

    oracletutorial.com oracle-base.com/

【讨论】:

以上是关于oracle insert if not exists 语句的主要内容,如果未能解决你的问题,请参考以下文章

insert 和 if x is not None

MySQL 当记录不存在时插入(insert if not exists)

MySQL atomic insert-if-not-exists 具有稳定的自动增量

MySQL 当记录不存在时插入(insert if not exists)

INSERT IF NOT EXISTS 类型函数供我在不将列转换为主键的情况下使用?

错误代码: 1449 The user specified as a definer ('root'@'%') does not exi