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