【问题标题】:Prevent Duplicate Insert Data in Oracle防止在 Oracle 中重复插入数据
【发布时间】:2016-04-11 06:56:49
【问题描述】:

我的 COBA 表有 3 个字段,它们是 NOMER、NAMA、KETERANGAN。在表中存在这样的数据:

我想在该表中插入另一个值,但是如何防止在 oracle 中重复插入查询数据? 我试过使用 WHERE NOT EXIST,这是我的查询:

INSERT INTO COBA(NOMER, NAMA, KETERANGAN)
(SELECT '2','FIAN', 'JEKULO'
FROM DUAL
WHERE NOT EXISTS (SELECT * FROM COBA WHERE NOMER='1' AND NAMA='AMIN' AND KETERANGAN='JEPARA'))

该查询不起作用....任何建议给我,...谢谢...

【问题讨论】:

  • 在字段上创建唯一约束:techonthenet.com/oracle/unique.php。如果NOMER 是主键,那么您将在NOMER 上创建一个PK,并在另外两个上创建一个唯一约束。如果你在所有三个上创建它,那么你可以有一个重复的NOMER
  • 是否有其他方法可以在不创建唯一约束的情况下解决此问题?
  • 是的,请确保子查询实际检查您要插入的字段... ps:NOMER 列是可疑的。如果是数字,请传递数字。
  • 您是否有不想使用唯一约束的原因? 99% 的数据库程序员认为他们是个好主意。它们还有助于提高性能,因为它们为查询规划器提供了有关数据的提示。
  • @Nick.McDermaid 你是对的,使用唯一约束是防止重复值的最佳选择,...但是我不使用它的原因是因为它出现了 ORA-00001: unique constraint (PAYROLL.COBA_UNIQUE) 违反了当我运行相同的值并且出现错误通知时,...在将数据插入我的项目时,我不会用户显示该错误..

标签: sql oracle11g


【解决方案1】:

使用唯一约束:

ALTER TABLE COBA ADD CONSTRAINT uni_c UNIQUE (NOMER, NAMA, KETERANGAN)

【讨论】:

  • 在不创建唯一约束的情况下还有其他方法可以解决这个问题吗?
  • 您可以创建自定义函数或触发器进行检查,但从长远来看,如果您预见到将来会再次发生这种情况,您应该添加约束。
  • 如果我创建唯一约束,..那么在 oracle 中插入数据的查询怎么样?和插入查询一样吗?
  • 是的,只是INSERT,就像你平时那样。请记住,如果您违反约束,您将收到错误。如果您想忽略某个INSERT 的约束,可能会有way to do this
  • 最后我使用了唯一约束,..但是当数据存在时跳过错误仍然不起作用,..我关注你的链接但我很难实现它。
【解决方案2】:

如果您不想使用唯一约束,您可以在插入时left join 检查目标中是否存在nomer,如下所示。通过这种方法,即使记录已经存在于您的表中,您也不会出错。它会被跳过。

insert into coba
(select s.nomer,s.nama,s.ket from 
    (select 1 as nomer,'AA' as nama,'bb' as ket from dual) s
left join 
    coba t
on s.nomer=t.nomer
    where t.nomer is null
);

我在 MySQL 中创建了一个小提琴(因为 Oracle 不工作),但功能是相同的。如下例所示,nomer =1 没有再次插入。

在此处查看小提琴演示

http://sqlfiddle.com/#!2/3add2/1

【讨论】:

  • 它工作了,..谢谢,...但是我怎样才能防止重复更多感谢查询中的字段,例如 nomer = 1、nama= amin 和 keterangan = jepara?
  • 我明白了,先生,...只需在 WHERE 之后添加条件,它就解决了,.. 非常感谢
  • 如果NOMER是主键并且是序列,..如何解决这个问题?
  • 如果是sequence,那么每次都会得到一个新值,不用担心重复。否则,您可以使用相同的逻辑(使用左连接)来确定它是否已经存在于表中。
  • 如果我在 NOMER 中添加序列,我得到类似这样的错误 ORA-02287: sequence number not allowed here,...有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 2016-02-19
相关资源
最近更新 更多