更改数据类型而无需更改“非空”约束

时间:2018-07-26 12:57:38

标签: sql oracle

我创建了具有“ 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失败,但无提示,因此我看不到任何错误消息。

1 个答案:

答案 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