12

我有一个名为 的表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有没有办法在执行上述查询之前检查列是否接受值......??

4

5 回答 5

13

您可以使用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 来更改表。手动进行,并确保首先仔细检查所有内容。

于 2013-03-27T11:43:32.260 回答
6

或者您可以忽略错误:

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;
/
于 2014-10-01T22:23:31.230 回答
2

当您之前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
  );
于 2021-03-25T11:10:06.110 回答
1

我做了这样的事情,效果很好。尝试执行查询,如果出现任何错误,catch 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);
}

这是正确的做法吗?

于 2013-03-28T03:50:47.737 回答
0

修改现有表的约束

例如...not null向列添加约束。

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

1) 选择要在其中修改更改的表。

2)点击Actions..--->选择列---->添加。

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

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

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

6)然后您将获得各种表格修改选项。

7)column从列表中选择。

8) 选择您要在其中给出的特定列not null

9)Cannot be null从中选择column properties

10) 就是这样。

于 2016-02-08T07:31:07.673 回答