我正在学习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;
但是它仍然允许我使用相同的用户代码输入“聊天”。无法改善触发器的任何帮助或建议。
谢谢。
答案 0 :(得分:3)
不要使用TRIGGER。
两个原因:
这样做
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约束的优点在于,数据库为您执行了此操作。