Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何一次性删除PostgreSQL表中的所有非空约束_Sql_Postgresql_Constraints_Sql Drop_Notnull - Fatal编程技术网

如何一次性删除PostgreSQL表中的所有非空约束

如何一次性删除PostgreSQL表中的所有非空约束,sql,postgresql,constraints,sql-drop,notnull,Sql,Postgresql,Constraints,Sql Drop,Notnull,是否可以一次性删除表中的所有非空约束 我有一个包含大量非空约束的大表,我正在寻找一个比单独删除它们更快的解决方案。是的,确实如此。我也有同样的问题 为了解决这个问题,我必须编写一个C.net脚本,它遍历所有plSql数据库并删除所有匹配的约束 有关如何删除单个约束的具体信息,请参见链接 您可以在同一alter语句中对它们进行分组: alter table tbl alter col1 drop not null, alter col2 drop not null,

是否可以一次性删除表中的所有非空约束


我有一个包含大量非空约束的大表,我正在寻找一个比单独删除它们更快的解决方案。

是的,确实如此。我也有同样的问题

为了解决这个问题,我必须编写一个C.net脚本,它遍历所有plSql数据库并删除所有匹配的约束


有关如何删除单个约束的具体信息,请参见链接

您可以在同一alter语句中对它们进行分组:

alter table tbl alter col1 drop not null,
                alter col2 drop not null,
                …
如果您想编写一个脚本来生成所需的sql,还可以从目录中检索相关列的列表。例如,类似于:

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。

如果要删除PostreSQL中的所有NOTNULL约束,可以使用此函数:

CREATE OR REPLACE FUNCTION dropNull(varchar) RETURNS integer AS $$
DECLARE
  columnName varchar(50);
BEGIN

    FOR columnName IN  

select a.attname
  from pg_catalog.pg_attribute a
 where attrelid = $1::regclass
   and a.attnum > 0
   and not a.attisdropped
   and a.attnotnull and a.attname not in(

   SELECT               
  pg_attribute.attname
FROM pg_index, pg_class, pg_attribute 
WHERE 
  pg_class.oid = $1::regclass AND
  indrelid = pg_class.oid AND
  pg_attribute.attrelid = pg_class.oid AND 
  pg_attribute.attnum = any(pg_index.indkey)
  AND indisprimary)

          LOOP
          EXECUTE 'ALTER TABLE ' || $1 ||' ALTER COLUMN '||columnName||' DROP NOT NULL';        
        END LOOP;
    RAISE NOTICE 'Done removing the NOT NULL Constraints for TABLE: %', $1;
    RETURN 1;
END;
$$ LANGUAGE plpgsql;
请注意,主键将被排除在外

然后,您可以使用以下命令调用它:

选择dropNullTABLENAME

使用超级用户权限有一种快速而肮脏的方式:

捷径很诱人。但是如果你搞砸了,你可能会破坏你的系统。 基本规则是:永远不要直接篡改系统目录

clean方法只需要常规权限即可更改表:在DO语句中使用动态SQL将其自动化,该语句实现:

还是很快。使用动态命令谨慎执行,并警惕SQL注入

这是一个更大答案的衍生:

在这里,我们需要从使用以下内容创建的表中删除NOTNULL约束:

CREATE TABLE tbl_b (LIKE tbl_a INCLUDING DEFAULTS);
自:

NOTNULL约束总是复制到新表中


ALTER TABLE TABLE_name ALTER COLUMN[SET NOT NULL | DROP NOT NULL]

我有一个场景,需要在整个数据库中从每个具有特定名称的字段中删除NOT NULL。这是我的解决办法。where子句可以修改为处理您需要的任何搜索模式

DO$$声明行记录; 开始划船 选择 表\u架构、表\u名称、列\u名称 从…起 信息\u schema.columns 哪里 “字段1”、“字段2”中的列名称 环 处决 “ALTER TABLE”| | row.TABLE| | |'。| | row.TABLE|u name | | |“ALTER” ||string_agg quote_identrow.column_name,'DROP NOT NULL,ALTER' ||'删除不为空;'; 端环; 完(元);
借鉴其他一些例子,这更符合我的需要

试试看,我认为这些链接可以帮助你找到实现这一点的方法。你的问题很好。我从未查询过目录。我的下一步就是尝试一下DO块。
DO
$$
BEGIN

EXECUTE (
   SELECT 'ALTER TABLE tbl_b ALTER '
       || string_agg (quote_ident(attname), ' DROP NOT NULL, ALTER ')
       || ' DROP NOT NULL'
   FROM   pg_catalog.pg_attribute
   WHERE  attrelid = 'tbl_b'::regclass
   AND    attnotnull
   AND    NOT attisdropped
   AND    attnum > 0
   );

END
$$
CREATE TABLE tbl_b (LIKE tbl_a INCLUDING DEFAULTS);