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

问题描述 投票:0回答:1

与现有表和序列一起使用的此命令失败,并出现 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:如何将现有主键列修改为标识列?

  1. 我不认为存在类型检查问题,因为序列应该返回一个 NUMERIC 值,该值将进入 NUMERIC 类型的列?

  2. 赠款应该没问题,因为使用带有序列和触发器的“旧方式”将数据插入消息表中。


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 sequence identity
1个回答
0
投票

抱歉,我不太明白你想说什么。

标题建议您使用 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>

因此,从我的角度来看,一切都按预期进行
。如果我错了,请解释为什么你认为我错了,并 - 如果可能 - 提供表明不同意见的文档。

© www.soinside.com 2019 - 2024. All rights reserved.