我正在尝试使用一些动态 SQL 在函数内重新创建表的结构。
EXECUTE 'CREATE TABLE ' || my_table_name || '_bk' ||
' (like ' || _my_table_name || ')';
Run Code Online (Sandbox Code Playgroud)
这将类似于:
CREATE TABLE my_table_bk
(like my_table);
Run Code Online (Sandbox Code Playgroud)
但我需要放弃所有约束。使用EXCLUDING CONSTRAINTS
在类似的选项,它仍然复制NOT NULL约束(文档证实了这一行为):
CREATE TABLE my_table_bk
(like my_table EXCLUDING CONSTRAINTS);
Run Code Online (Sandbox Code Playgroud)
问题是,如何在没有 NOT NULL 约束的情况下重新创建表结构,或者删除表中的所有 NOT NULL 约束?
小智 19
尝试这个:
CREATE TABLE my_table_bk
AS
SELECT *
FROM my_table
WHERE false;
Run Code Online (Sandbox Code Playgroud)
或者,您可以附加LIMIT 0
而不是WHERE
子句。
这将创建一个my_table_bk
与my_table
没有约束和没有数据的结构相同的表。
这是在 Stack Overflow 上如何一次性从 PostgreSQL 表中删除所有 NOT NULL 约束中提出的问题。它似乎提供了一系列很好的解决方案。
您可以将它们全部分组在同一个 alter 语句中:
Run Code Online (Sandbox Code Playgroud)alter table tbl alter col1 drop not null, alter col2 drop not null, …
如果您想编写一个do 块来生成所需的 SQL ,您还可以从目录中检索相关列的列表。例如,类似于:
Run Code Online (Sandbox Code Playgroud)select a.attname from pg_catalog.pg_attribute a where attrelid = 'tbl'::regclass and a.attnum > 0 and not a.attisdropped and a.attnotnull;
(请注意,这也将包括与主键相关的字段,因此您需要将它们过滤掉。)
如果您这样做,请不要忘记
quote_ident()
在您需要处理列名称中潜在的奇怪字符时使用。
归档时间: |
|
查看次数: |
33401 次 |
最近记录: |