【问题标题】:TRIGGER in oracle to prevent insert duplicate data在oracle中触发以防止插入重复数据
【发布时间】:2018-08-01 23:41:24
【问题描述】:

我正在学习 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;

但它仍然允许我使用相同的用户代码进入聊天。任何改进我的触发器的帮助或建议都不起作用。

谢谢。

【问题讨论】:

  • 不,不,不,不,不!
  • okey 我知道,就像@thatjeffsmith 说的那样,我必须为我的 id_user 使用唯一索引,但如果我想用另一个 start_chat 和 end_chat 插入相同的 id_user,我必须创建触发器以确保日期不会位于 start_chat 和 end_chat 的第一个寄存器之间。
  • 一个用户不能同时进行多个聊天?我每天都违反这条规则。此外,这完全是一个不同的问题。
  • @thatjeffsmith 这不是像 facebook 或 insta 这样的聊天,是的,我转换了另一个不同的问题,你能帮我一些想法吗?谢谢。

标签: oracle plsql oracle11g oracle-sqldeveloper


【解决方案1】:

不要使用触发器。

两个原因:

  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 可能会更快。

附:你的触发器没有做你想做的事。如果您要使用触发器执行此操作,则需要在 :new.id_user in (select distinct id_user from chat) 时引发异常...所以基本上如果在表中已经找到导致 INSERT 的 ID,就会例外。 PK 约束的美妙之处在于,数据库为您执行此操作。

【讨论】:

  • @thahjeffsmith 在这部分“if :new.id_user in (select distinct id_user from chat)”当我创建我的触发器时,Oracle 告诉我“在这种情况下不允许子查询”
  • @Stalinn 不要使用触发器来防止重复
  • 我有一个疑问,不知道您能否澄清一下。我有一个 01-01-18 像 start_training 和 05-01-18 像 end_training 的用户,现在我想注册同一个用户,但这次是 03-01-18 像 star_training 和 06-01-18,这些日期是与第一个寄存器的日期不同,但在第一个寄存器的日期范围之间包含 03-01-18。是否需要使用触发器或程序或者这部分需要编程?
  • 如果这不是有效数据,那么它来自哪里?在不知道您的业务规则和数据模型的情况下来回传递 cmets 会让我们双方都感到非常沮丧
猜你喜欢
  • 2016-04-11
  • 2021-09-25
  • 2013-12-26
  • 2013-10-12
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多