在Oracle中触发以防止插入重复数据

时间:2018-08-01 23:41:25

标签: oracle plsql oracle11g oracle-sqldeveloper

我正在学习Oracle,但遇到了问题。我有“聊天”表:

CREATE TABLE chat (
    id_chat      NUMBER,
    id_user      NUMBER,
    start_chat   DATE,
    end_chat     DATE
);

现在,我创建了一个触发器,以便如果已经使用相同的id_user注册了一个旧的触发器,则不允许我输入“交谈”。这是我的触发器:

create or replace trigger distChat
before insert on Chat
for each row
begin
if :new.id_user = :old.id_user then
        Raise_Application_Error(-20099,'YOU CAN'T INSERT DUPLICATED DATA.');
end if;
end distChat;

但是它仍然允许我使用相同的用户代码输入“聊天”。无法改善触发器的任何帮助或建议。

谢谢。

1 个答案:

答案 0 :(得分:3)

不要使用TRIGGER。

两个原因:

  1. Oracle提供了一种防止重复的机制
  2. 触发器很昂贵,需要维护另一个数据库对象

这样做

ALTER table CHAT ADD CONSTRAINT xpk_chat PRIMARY KEY ( ID_CHAT );

我不知道您的数据模型,但我认为您希望ID_CHAT区分聊天。如果您为ID_USER进行此操作,那么一个用户最多只能进行一次聊天...谁想使用该系统?如果我错了,只需更改以上ALTER命令中引用的列即可。

现在,您的表将具有一个约束,以防止ID_CHAT列上的重复值。这称为主键(Docs

此外,您将拥有一个INDEX,因此通过其ID值查询CHAT的速度可能更快。

P.S。您的触发器没有按照您想要的去做。如果要使用触发器来执行此操作,则在:new.id_user中(从聊天中选择不同的id_user)时,需要引发异常...因此,基本上,如果在表中已经找到导致INSERT的ID,是一个例外。 PK约束的优点在于,数据库为您执行了此操作。