如果表中不存在特定的列值,则尝试插入值
我尝试在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查询的初学者。帮助我继续前进。预先感谢
答案 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')