尝试在Oracle中不存在的运算符时插入问题

时间:2019-06-14 10:05:22

标签: oracle

如果表中不存在特定的列值,则尝试插入值

我尝试在where语句中使用子查询

INSERT
INTO ANIMALDATA VALUES
 ( 
   ( SELECT MAX(first)+1 FROM ANIMALDATA
   )
   ,
   'Animals',
   'Lion',
   10,
   '',
   '13-06-2019',
   'STOP'
 )
where not exists 
(select NAMES from ANIMALDATA where NAMES='Lion');

如果狮子不存在,则应该运行insert语句

给我一​​个主意,因为我是oracle查询的初学者。帮助我继续前进。预先感谢

3 个答案:

答案 0 :(得分:0)

请在下面尝试。谢谢,

INSERT
INTO ANIMALDATA a
select 
   ( SELECT MAX(first)+1 FROM ANIMALDATA
   )
   ,
   'Animals',
   'Lion',
   10,
   '',
   '13-06-2019',
   'STOP'
from dual
where not exists 
(select 1 from ANIMALDATA b where b.NAMES='Lion' and a.NAMES = b.NAMES );

答案 1 :(得分:0)

由于您有条件,我认为您需要执行INSERT INTO ... SELECT:

(更新:此处提供CREATE TABLE语句以提供简单的测试数据。这不是解决方案的一部分)。

创建表animaldata(第一,王国,名称,num,nl,dte,s)为

从双中选择1,'Animals','Tiger',11,'a','13 -06-2019','STOP';

INSERT 
INTO ANIMALDATA select 
   ( SELECT MAX(first)+1 FROM ANIMALDATA
   )
   ,
   'Animals',
   'Lion',
   10,
   '',
   '13-06-2019',
   'STOP'
from dual
where not exists 
(select NAMES from ANIMALDATA where NAMES='Lion');

最好的问候, 炖阿什顿

答案 2 :(得分:0)

首先,请不要使用max(<value>) + 1来为列提供新值-在并发会话中不能很好地发挥作用。

相反,您应该创建一个序列并将其用于插入中。

接下来,如果您尝试进行upsert(如果存在该行,则进行更新;如果不存在,则进行插入),则可以使用MERGE语句。在这种情况下,您要尝试插入不存在的行,因此不需要更新部分。

因此,您应该执行以下操作:

CREATE SEQUENCE animaldata_seq
 START WITH     <find MAX VALUE OF animaldata.first>
 INCREMENT BY   1
 MAXVALUE 9999999999999999
 CACHE 20
 NOCYCLE;

MERGE INTO animaldata tgt
  USING (SELECT 'Animals' category,
                'Lion' animal,
                10 num_animals,
                NULL unknown_col,
                TRUNC(SYSDATE) date_added,
                'STOP' action
         FROM   dual) src
  ON (tgt.animal = src.animal)
WHEN NOT MATCHED THEN
  INSERT (<list of animaldata columns>)
  VALUES (animaldata_seq.nextval,
          src.animal,
          src.unknown_col,
          src.date_added,
          src.action);

请注意,我尝试指定要插入的列-这是一个好习惯!如果有人向表中添加列,则包含未插入要列出的列的插入语句的代码很容易出错。

我还假设您要添加日期的列为DATE数据类型;我已经使用sysdate(将其删除以删除时间部分)作为要插入的值,但是您可以使用一个特定的日期,在这种情况下,您应该使用to_date(<string date>, '<string date format')