将列修改为NULL - Oracle

时间:2013-03-27 11:33:35

标签: oracle11g

我有一个名为CUSTOMER的表,列数很少。其中一个是Customer_ID

最初Customer_IDWILL NOT接受NULL值。

我已从代码级别进行了一些更改,因此Customer_ID列默认会接受NULL值。

现在我的要求是,我需要再次使此列接受NULL值。

为此,我添加了执行以下查询:

ALTER TABLE Customer MODIFY Customer_ID nvarchar2(20) NULL

我收到以下错误:

ORA-01451 error, the column already allows null entries so
therefore cannot be modified

这是因为我已将Customer_ID列设为接受NULL值。

在执行上述查询之前,有没有办法检查列是否接受NULL值???

5 个答案:

答案 0 :(得分:10)

您可以在USER_TAB_COLUMNS中使用NULLABLE列。这将告诉您列是否允许使用二进制Y / N标志的空值。

如果您想将其放在脚本中,您可以执行以下操作:

declare

   l_null user_tab_columns.nullable%type;

begin

   select nullable into l_null
     from user_tab_columns
    where table_name = 'CUSTOMER'
      and column_name = 'CUSTOMER_ID';

   if l_null = 'N' then
      execute immediate 'ALTER TABLE Customer 
                          MODIFY (Customer_ID nvarchar2(20) NULL)';
   end if;

end;

最好使用动态SQL来改变表格。手动完成并确保先检查一切。

答案 1 :(得分:4)

或者你可以忽略错误:

declare
    already_null exception;
    pragma exception_init (already_null , -01451);
begin
    execute immediate 'alter table <TABLE> modify(<COLUMN> null)';
    exception when already_null then null;
end;
/

答案 2 :(得分:1)

我做了这样的事情,它工作得很好。 尝试执行查询,如果发生任何错误,请捕获SQLException

try {
stmt.execute("ALTER TABLE Customer MODIFY Customer_ID nvarchar2(20) NULL");
} catch (SQLException sqe) {
Logger("Column to be modified to NULL is already NULL : " + sqe);
}

这是正确的做法吗?

答案 3 :(得分:1)

当您之前为 DEFAULT ON NULL 列提供了 NOT NULL 值时,您可能会遇到此错误。

如果是这种情况,要使列可以为空,您还必须在修改其可为空性约束时将其默认值重置为 NULL

例如:

DEFINE table_name = your_table_name_here
DEFINE column_name = your_column_name_here;

ALTER TABLE &table_name
  MODIFY (
    &column_name
      DEFAULT NULL
      NULL
  );

答案 4 :(得分:0)

修改现有表格的约束

例如...将not null约束添加到列。

然后按照给定的步骤进行操作:

1)选择要修改更改的表。

2)点击Actions.. ---&gt;选择列----&gt;添加。

3)现在给出列名,数据类型,大小等,然后单击“确定”。

4)您将看到该列已添加到表中。

5)现在点击位于Edit按钮左侧的Actions按钮。

6)然后你会得到各种表修改选项。

7)从列表中选择column

8)选择要在其中提供not null的特定列。

9)从Cannot be null选择column properties

10)就是这样。