我有一些带有<context-param>
<description>Set to true to disable compression of CSS class names for
skinning keys and have more human readable class
names</description>
<param-name>org.apache.myfaces.trinidad.DISABLE_CONTENT_COMPRESSION</param-name>
<param-value>true</param-value>
</context-param>
约束的大表(30多列)。我想将所有这些约束更改为NOT NULL
。要为单个列执行此操作,我可以使用
NULL
有没有办法在一个请求中为所有列执行此操作?或者我应该为所有列复制/粘贴此行(&gt;&lt;)?
答案 0 :(得分:2)
有没有办法在一个请求中为所有列执行此操作?
是。通过(ab)在 PL / SQL 中使用 EXECUTE IMMEDIATE 。通过查询 USER_TAB_COLUMNS 视图遍历所有列。
例如,
FOR i IN
( SELECT * FROM user_tab_columns WHERE table_name = '<TABLE_NAME>' AND NULLABLE='N'
)
LOOP
EXECUTE IMMEDIATE 'ALTER TABLE <TABLE_NAME> MODIFY i.COLUMN_NAME NULL';
END LOOP;
在我看来,当你编写PL / SQL块时,你可以通过使用一个好的文本编辑器来快速完成。在纯 SQL 中,您只需要30个查询30列。
答案 1 :(得分:2)
对于单个表,您可以发出一个alter table
命令来将列出的列设置为允许null
,这比一次运行一列更有效,但您仍需要列出每一栏。
alter table ...
modify (
col1 null,
col1 null,
col3 null);
如果您正在应用not null
约束,那么这将更有价值,因为它们需要扫描表以确保不存在空值,并且(我认为)是独占表锁。
答案 2 :(得分:1)
您可以查询user_tab_cols
并将其与FOR光标&amp; EXECUTE IMMEDIATE修改所有非空列 - 执行的PL / SQL块看起来像这样:
DECLARE
v_sql_statement VARCHAR2(2000);
BEGIN
FOR table_recs IN (SELECT table_name, column_name
FROM user_tab_cols
WHERE nullable = 'N') LOOP
v_sql_statement :=
'ALTER TABLE ' || table_recs.table_name || ' MODIFY ' || table_recs.column_name || ' NULL';
EXECUTE IMMEDIATE v_sql_statement;
END LOOP;
END;
如果要对数据库中的所有列而不是当前架构中的列执行此操作,则可以替换user_tab_cols并输入dba_tab_cols;我只是在FOR中运行查询,以确保提取的列确实是要修改的正确的列