与现有表和序列一起使用的此命令失败,并出现 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 概念,如此处所述
我不认为存在类型检查问题,因为序列应该返回一个 NUMERIC 值,该值将进入 NUMERIC 类型的列?
赠款应该没问题,因为使用带有序列和触发器的“旧方式”将数据插入消息表中。
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
它会起作用的。
抱歉,我不太明白你想说什么。
标题建议您使用 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>
因此,从我的角度来看,一切都按预期进行。如果我错了,请解释为什么你认为我错了,并 - 如果可能 - 提供表明不同意见的文档。