Oracle 19.17引用序列作为主键列的默认值失败,ORA 02262

g52tjvyc  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(291)

此命令与现有表和序列一起使用时会失败,并显示ORA 02262错误,同时类型检查列默认表达式

MESSAGES TABLE INFO
ID NUMBER(38) Primary Key

ALTER TABLE MESSAGES MODIFY
ID DEFAULT MESSAGES.SEQ.NEXTVAL

无论如何我都能做到

CREATE SEQUENCE TEST_SEQ;

CREATE TABLE TEST
(ID NUMBER NOT NULL,
NAME VARCHAR2)

然后

ALTER TABLE TEST MODIFY
(ID DEFAULT TEST_SEQ.NEXTVAL

它会成功的
主要目标是不再使用序列和触发器的组合来帮助填充ID,而是转向更接近这里所述的IDENTITY概念
Oracle 12c: How can I modify an existing primary key column to an identity column?
1.我不相信有一个类型检查问题,因为序列应该返回一个NUMERIC值,这是进入一个列类型是NUMERIC?
1.赠款应该是确定的,因为插入数据到消息表使用“老办法”与序列和触发器。

ALTER TABLE MESSAGES MODIFY
ID DEFAULT MESSAGES.SEQ.NEXTVAL

无论如何我都能做到

CREATE SEQUENCE TEST_SEQ;

CREATE TABLE TEST
(ID NUMBER NOT NULL,
NAME VARCHAR2)

然后

ALTER TABLE TEST MODIFY
(ID DEFAULT TEST_SEQ.NEXTVAL

它会成功的

nszi6y05

nszi6y051#

对不起,我不太明白你想说什么。
标题建议您使用Oracle 19。它支持标识列,那么-为什么不使用该功能呢?请注意,Oracle将在后台创建一个序列,所以如果你认为你会摆脱一个序列-不,你不会。但你不需要触发器,没错。

SQL> create table messages (id number generated always as identity primary key);

Table created.

如果你按你的方式做,为什么你认为它应该起作用?

SQL> create table messages (id number primary key);

Table created.

SQL> alter table messages modify id default MESSAGES.SEQ.NEXTVAL;
alter table messages modify id default MESSAGES.SEQ.NEXTVAL
                            *          ====================
ERROR at line 1:                       what does this represent?        
ORA-02262: ORA-2289 occurs while type-checking column default value expression

序列必须存在才能作为默认值;我不认为Oracle会以这种方式为您创建一个:

SQL> create sequence seq;

Sequence created.

SQL> alter table messages modify id default SEQ.NEXTVAL;

Table altered.

SQL>

因此,从我的Angular 来看,一切都像预期的那样工作。如果我错了,请解释为什么你认为我错了,如果可能的话,提供不同的文件。

相关问题