首页 > 解决方案 > ORA-00904: "TYPE": 触发器上的标识符无效。我哪里出错了?

问题描述

我创建了一个主键自动递增的表。我已经发送了相关数据、序列和触发器。但是到目前为止,我还没有希望执行自动增量,并且我的触发器不断抛出错误。

代码:

CREATE SEQUENCE empid_seq
INCREMENT BY 1
START WITH 1101
NOCACHE;

CREATE TRIGGER empuser_trigger
before insert on empuser
for each row
begin
if :new.empuserid.nextval into :new.empuserid from dual;
end if;
end;
/


INSERT INTO empuser VALUES(empid_seq.nextval, 'James', 'Kirk', '+447911123456', '401', '203', (SELECT messageid FROM message WHERE messageid = '2101'));
INSERT INTO empuser VALUES(empid_seq.nextval, 'Spock', 'Spock?', '+447911123466', '401', '203', (SELECT messageid FROM message WHERE messageid = '2103'));
INSERT INTO empuser VALUES(empid_seq.nextval, 'Leonard', 'McCoy', '+447911144456', '401', '203', (SELECT messageid FROM message WHERE messageid = '2104'));
INSERT INTO empuser VALUES(empid_seq.nextval, 'Hikaru', 'Sulu', '+447911123856', '401', '203', (SELECT messageid FROM message WHERE messageid = '2106'));

我想要的是 ID 在用户输入时自动递增。

标签: sqloracleoracle11gsql-insertdatabase-trigger

解决方案


if 语句的比较主要问题可能是:

if <some condition> = <other condition> then 
 :new.empuserid := empid_seq.nextval;
end if;

然后你可以试试下面:

因为只有一个候选列emp user id是表的第一列,所以从插入语句中可以理解没有表的列列表empuser,那么您似乎正在尝试emp user id通过两种方式设置 by 序列

摆脱其中之一:

消除

:new.empuserid.nextval into :new.empuserid from dual;即移除触发器。

或者

empid_seq.nextval,在插入语句中,并作为

:new.empuserid := empid_seq.nextval;顺便说一下,明确列出所有列,除了empuserid在插入语句中作为INSERT INTO empuser(col2,col3...) VALUES. 将这些插入语句转换为

INSERT INTO empuser
SELECT empid_seq.nextval, 'James', 'Kirk', '+447911123456', '401', '203',
       messageid 
  FROM message 
 WHERE messageid = '2101'

推荐阅读