将列修改为 NULL - Oracle

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

我有一个名为

CUSTOMER
的表,其中有几列。其中之一是
Customer_ID

最初

Customer_ID
WILL 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
值...??

oracle11g
6个回答
14
投票

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


7
投票

或者您可以忽略该错误:

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
投票

如果您之前为

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
  );

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);
}

这是正确的做法吗?


0
投票

修改现有表的约束

例如...向列添加

not null
约束。

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

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

2) 点击

Actions..
---> 选择列 ----> 添加。

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

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

5) 现在单击位于

Edit
按钮左侧的
Actions
按钮。

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

7) 从列表中选择

column

8) 选择您要在其中给出

not null
的特定列。

9) 从

Cannot be null
中选择
column properties

10) 就是这样。


0
投票

正确答案是

SELECT tc.owner, tc.table_name, tc.column_name, tc.nullable
     , c.search_condition_vc, c.constraint_name 
  FROM all_tab_columns tc
  JOIN all_constraints c
    ON (    c.owner = tc.owner
        AND c.table_name = tc.table_name
        AND c.search_condition_vc = tc.column_name||' IS NOT NULL'
       )
  WHERE tc.owner = upper(NVL('&"Table schema"', USER))
    AND tc.table_name = UPPER('&"Table name"') 
    AND tc.nullable = 'N' 
    AND tc.column_name = UPPER('&"Column name"')
;
ALTER TABLE <TABLE_SCHEMA>.<TABLE_NAME> 
  DROP CONSTRAINT <found_constraint_name>
;
© www.soinside.com 2019 - 2024. All rights reserved.