我有一个包含 75 多个列的表。
几乎所有列都有 NOT NULL 约束。
如果执行巨大的更改表修改语句(其中的每一列),我会收到一条错误消息,内容大致为“您不能将此字段设置为 NULL,因为它已经是 NULL”
我必须对几个表执行此操作,因此更希望有一个动态解决方案。
我可以动态查找所有不为 NULL 的列,并将它们设置为 NULL 吗?
我见过几个类似的问题,但找不到 Oracle SQL 的解决方案。无论如何将表中的所有列修改为“不为空” https://stackoverflow.com/questions/18764737/modify-all-columns-in-a-table-to-not-null-no-matter-what
这是一个测试表,有两个非空列和一个空列:
create table zzz_mark_test_me (
cust_id varchar2(20) not null,
cust_name varchar2(20) null,
cust_phone varchar2(20) not null
);
table ZZZ_MARK_TEST_ME created.
desc zzz_mark_test_me
Name Null Type
---------- -------- ------------
CUST_ID NOT NULL VARCHAR2(20)
CUST_NAME VARCHAR2(20)
CUST_PHONE NOT NULL VARCHAR2(20)
现在调用此 SQL:
select 'alter table ' || table_name ||
' modify (' || column_name || ' null );'
from user_tab_columns
where table_name='ZZZ_MARK_TEST_ME' and nullable='N'
order by column_id;
这会产生这样的结果:
alter table ZZZ_MARK_TEST_ME modify (CUST_ID null );
alter table ZZZ_MARK_TEST_ME modify (CUST_PHONE null );
将输出复制/粘贴到 SQL*Plus 等中并调用:
alter table ZZZ_MARK_TEST_ME modify (CUST_ID null );
table ZZZ_MARK_TEST_ME altered.
alter table ZZZ_MARK_TEST_ME modify (CUST_PHONE null );
table ZZZ_MARK_TEST_ME altered.
现在,不再有 NOT NULL:
desc zzz_mark_test_me
Name Null Type
---------- ---- ------------
CUST_ID VARCHAR2(20)
CUST_NAME VARCHAR2(20)
CUST_PHONE VARCHAR2(20)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)