我有一个名为
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
值...??
您可以在 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 来更改表。手动进行,并确保首先仔细检查所有内容。
或者您可以忽略该错误:
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;
/
如果您之前为
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
);
我做了这样的事情,效果很好。 尝试执行查询,如果出现错误,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);
}
这是正确的做法吗?
修改现有表的约束
例如...向列添加
not null
约束。
然后按照给定的步骤操作:
1) 选择要修改更改的表。
2) 点击
Actions..
---> 选择列 ----> 添加。
3) 现在给出列名称、数据类型、大小等,然后单击“确定”。
4) 您将看到该列已添加到表中。
5) 现在单击位于
Edit
按钮左侧的 Actions
按钮。
6)然后你会得到各种表格修改选项。
7) 从列表中选择
column
。
8) 选择您要在其中给出
not null
的特定列。
9) 从
Cannot be null
中选择column properties
。
10) 就是这样。
正确答案是
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>
;