Oracle 过程-仅当不存在时插入

Oracle 过程-仅当不存在时插入,oracle,plsql,Oracle,Plsql,我有一个插入城市名称并创建下一个id的过程。如果名称已经存在,如何不让插入城市名称到表中?谢谢 这是我的代码: create or replace PROCEDURE PlaceName( town IN City.Name%TYPE) AS id_C City.Id_City%TYPE; BEGIN SELECT NVL(Max(c.Id_City)+1,1) INTO id_C FROM City c; INSERT INTO City VALUES

我有一个插入城市名称并创建下一个id的过程。如果名称已经存在,如何不让插入城市名称到表中?谢谢 这是我的代码:

create or replace 
PROCEDURE PlaceName(
          town IN City.Name%TYPE)
AS
  id_C City.Id_City%TYPE;
BEGIN
  SELECT NVL(Max(c.Id_City)+1,1) INTO id_C
  FROM City c;
  INSERT INTO City
  VALUES(id_C, town);
End;

查找Oracle合并命令。

查找Oracle合并命令。

否,仅当Oracle合并命令不存在时才插入。这需要两个操作。您必须检查它是否存在,然后插入记录

正确的方法是在表上创建一个。您可以按照文档中的说明进行内联操作,或者如果您的表已经存在,您可以修改它以添加约束:

ALTER TABLE table_name
add CONSTRAINT constraint_name UNIQUE (city);
然后,您将捕获插入已存在的城市时引发的异常,然后根据所获得的信息执行任何操作

您还错误地增加了您的ID。您应该使用,这将为您保存另一个选择

CREATE SEQUENCE city_seq
     START WITH <current max ID>
   INCREMENT BY 1;
然后,您的程序将变为:

create or replace procedure PlaceName (
          town in city.name%type ) is

begin
  insert into city
  values(city_seq.nextval, town);

-- Catch the raised exception if the city already exists.
exception when dup_val_on_index then
   <do something>;
end;

不,仅当它不存在时才插入。这需要两个操作。您必须检查它是否存在,然后插入记录

正确的方法是在表上创建一个。您可以按照文档中的说明进行内联操作,或者如果您的表已经存在,您可以修改它以添加约束:

ALTER TABLE table_name
add CONSTRAINT constraint_name UNIQUE (city);
然后,您将捕获插入已存在的城市时引发的异常,然后根据所获得的信息执行任何操作

您还错误地增加了您的ID。您应该使用,这将为您保存另一个选择

CREATE SEQUENCE city_seq
     START WITH <current max ID>
   INCREMENT BY 1;
然后,您的程序将变为:

create or replace procedure PlaceName (
          town in city.name%type ) is

begin
  insert into city
  values(city_seq.nextval, town);

-- Catch the raised exception if the city already exists.
exception when dup_val_on_index then
   <do something>;
end;

我同意Ben的观点,表上应该有一个唯一的约束,假设这是一个有效的约束,但是使用MERGE语句可以简化这一点:

MERGE INTO city c
USING ( SELECT 1 FROM dual )
   ON c.name = town
 WHEN NOT MATCHED THEN INSERT ( id, name )
      VALUES ( my_sequence.NEXTVAL, town );

此处实际上不需要USING子句,但它对于merge语句是必需的。

我同意Ben的观点,即表上应该有一个唯一的约束,假设这是一个有效的约束,但使用merge语句可以简化这一点:

MERGE INTO city c
USING ( SELECT 1 FROM dual )
   ON c.name = town
 WHEN NOT MATCHED THEN INSERT ( id, name )
      VALUES ( my_sequence.NEXTVAL, town );
insert into City
  select seq.nextval, town
from dual where not exists (select 1 from City where name = town);
这里实际上不需要USING子句,但对于merge语句它是必需的

insert into City
  select seq.nextval, town
from dual where not exists (select 1 from City where name = town);
我严格建议对人工关键点使用序列。 选择nvlmax非常非常糟糕。 如果您需要解释,请询问我:

我严格建议对人工关键点使用序列。 选择nvlmax非常非常糟糕。 如果您需要解释,请询问我: