sql - 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 在用户输入时自动递增。
解决方案
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'
推荐阅读
- string - 如何子串 0 到 30,但前提是有超过 30 个字符
- python - 安装 django-cors-middleware 的问题
- postgresql - 关系“schema.table”不存在使用 slick 3.3.3 时抛出的异常
- linux - 不允许程序杀死任何未关联的进程
- html - 如何在一个 css 文件中使用不同的颜色主题
- symfony - Symfony 5 表单集合的问题
- python - 我应该在 keras 中使用什么损失函数和度量来进行多标签分类?
- java - 无法在 Android Studio 中读取 JSON
- c++ - ESP32 尝试重新连接到网络断开时没有停止循环(Arduino)
- python - 使用 AES-GCM 加密不适合 RAM 的大文件