我创建了具有“ Not null”约束的数据类型为VARCHAR2(3000)的表“ A”。表“ A”具有一个列“ someColumn”作为主键。如下:
CREATE TABLE A (
"someColumn" VARCHAR2(3000) NOT NULL
)
ALTER TABLE A
ADD CONSTRAINT pk_A PRIMARY KEY (
"someColumn"
)
现在我想将数据类型从VARCHAR2(3000)更改为VARCHAR2(4000),但是我不想更改约束。所以我用:
ALTER TABLE A
MODIFY
(
"someColumn" VARCHAR2(4000)
)
它起作用了,现在我的ddl如下:
PROMPT CREATE TABLE a
CREATE TABLE a (
"someColumn" VARCHAR2(4000) NOT NULL
)
/
PROMPT ALTER TABLE a ADD CONSTRAINT pk_a PRIMARY KEY
ALTER TABLE a
ADD CONSTRAINT pk_a PRIMARY KEY (
"someColumn"
)
/
然后我使用如下代码:
ALTER TABLE A
MODIFY
(
"someColumn" VARCHAR2(3000) NULL
)
我收到消息“更改表,已执行...”,但是当我再次检查ddl时-我仍然具有“ Not null”约束和新的数据类型(4000)。 是Oracle错误吗? 为了确保我在使用的“ SQLTools”中没有任何缓存,
SELECT * FROM all_tab_cols WHERE table_name = 'A'
答案: 更改为NULLABLE失败,但无提示,因此我看不到任何错误消息。
答案 0 :(得分:1)
在作为主键的列上,您可以更改长度,但不能nullable
(因为它是PK
,不能NULL
。
初始状态3000长度不为空
select COLUMN_NAME, DATA_LENGTH, NULLABLE from user_tab_columns where table_name = 'A';
COLUMN_NAME DATA_LENGTH N
------------------------------ ----------- -
someColumn 3000 N
将长度更改为4000-确定
ALTER TABLE A
MODIFY
(
"someColumn" VARCHAR2(4000)
)
;
select COLUMN_NAME, DATA_LENGTH, NULLABLE from user_tab_columns where table_name = 'A';
COLUMN_NAME DATA_LENGTH N
------------------------------ ----------- -
someColumn 4000 N
将长度更改为3000-确定
使其可为空-由于PK不可为空而导致的静默失败
ALTER TABLE A
MODIFY
(
"someColumn" VARCHAR2(3000) NULL
);
select COLUMN_NAME, DATA_LENGTH, NULLABLE from user_tab_columns where table_name = 'A';
COLUMN_NAME DATA_LENGTH N
------------------------------ ----------- -
someColumn 3000 N
如果您不想看到错误消息-将更改分为两部分(更改长度和设置为可空)。
第一个将通过,第二个将明显失败。
ALTER TABLE A
MODIFY
(
"someColumn" VARCHAR2(3000)
);
ALTER TABLE A
MODIFY
(
"someColumn" NULL
);
ORA-01451: column to be modified to NULL cannot be modified to NULL