Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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:如何有效地从psql更改多个列?_Sql_Postgresql - Fatal编程技术网

PostgreSQL:如何有效地从psql更改多个列?

PostgreSQL:如何有效地从psql更改多个列?,sql,postgresql,Sql,Postgresql,我有一个带有几个布尔列的PostgreSQL表,当前只包含true或null。我想为所有人做以下工作: 添加默认值false 将所有空值更改为false 添加一个非空约束 即: psql(或标准SQL)是否有一个功能可以迭代指定的列列表,并对每个列应用一系列操作?您不能迭代所有列,但为了安全起见,您可能不想这样做,而是指定要更改的列。另一种方法是使用脚本查询列名,然后修改它们 要更改它们,请使用altertable。请参阅PgSQL文档: etc这就可以了,因为变量的原因,需要8.4版或更高版

我有一个带有几个布尔列的PostgreSQL表,当前只包含true或null。我想为所有人做以下工作:

  • 添加默认值false
  • 将所有空值更改为false
  • 添加一个
    非空
    约束
  • 即:


    psql(或标准SQL)是否有一个功能可以迭代指定的列列表,并对每个列应用一系列操作?

    您不能迭代所有列,但为了安全起见,您可能不想这样做,而是指定要更改的列。另一种方法是使用脚本查询列名,然后修改它们

    要更改它们,请使用
    altertable
    。请参阅PgSQL文档:


    etc

    这就可以了,因为变量的原因,需要8.4版或更高版本

    CREATE OR REPLACE FUNCTION setdefaults(
        IN _tname TEXT,     -- tablename to alter
        VARIADIC _cname TEXT[]  -- all columnnames to alter
    ) 
    RETURNS boolean 
    LANGUAGE plpgsql 
    AS
    $$
    DECLARE
        row record;
    BEGIN   
        FOR row IN SELECT unnest(_cname) AS colname LOOP
            EXECUTE 'ALTER TABLE ' || quote_ident(_tname) || ' ALTER COLUMN ' || quote_ident(row.colname) || ' SET DEFAULT false;';
            EXECUTE 'UPDATE ' || quote_ident(_tname) || ' SET ' || quote_ident(row.colname) || ' = DEFAULT WHERE ' || quote_ident(row.colname) || ' IS NULL;';
            EXECUTE 'ALTER TABLE ' || quote_ident(_tname) || ' ALTER COLUMN ' || quote_ident(row.colname) || ' SET NOT NULL;';
        END LOOP;
    
        RETURN TRUE;
    END;
    $$;
    
    SELECT setdefaults('foo', 'x','y','z'); -- alter table "foo" 
    

    谢谢我知道如何手动操作,但我只是想知道是否有迭代工具。我将进行编辑以使其更清楚:)另外,在设置
    非null
    之前,有必要将null值更新为false,否则您将收到一个错误;设置默认值不会导致在添加多个逗号分隔的
    ALTER列
    命令时自动转换
    notnull
    我以前从来没有注意到这个语法。太棒了,谢谢!这段代码包含了我不知道的有用的东西。
    ALTER TABLE xy ALTER COLUMN a SET DEFAULT FALSE, ALTER COLUMN b SET NOT NULL
    
    CREATE OR REPLACE FUNCTION setdefaults(
        IN _tname TEXT,     -- tablename to alter
        VARIADIC _cname TEXT[]  -- all columnnames to alter
    ) 
    RETURNS boolean 
    LANGUAGE plpgsql 
    AS
    $$
    DECLARE
        row record;
    BEGIN   
        FOR row IN SELECT unnest(_cname) AS colname LOOP
            EXECUTE 'ALTER TABLE ' || quote_ident(_tname) || ' ALTER COLUMN ' || quote_ident(row.colname) || ' SET DEFAULT false;';
            EXECUTE 'UPDATE ' || quote_ident(_tname) || ' SET ' || quote_ident(row.colname) || ' = DEFAULT WHERE ' || quote_ident(row.colname) || ' IS NULL;';
            EXECUTE 'ALTER TABLE ' || quote_ident(_tname) || ' ALTER COLUMN ' || quote_ident(row.colname) || ' SET NOT NULL;';
        END LOOP;
    
        RETURN TRUE;
    END;
    $$;
    
    SELECT setdefaults('foo', 'x','y','z'); -- alter table "foo"