PostgreSQL 增加列长

who*_*ows 3 postgresql ddl types dynamic-sql

示例我有一个名为A- 的表Z,但只有

    table "A" and table "J"
Run Code Online (Sandbox Code Playgroud)

有一个

    column clm varchar(10). 
Run Code Online (Sandbox Code Playgroud)

但后来我意识到我需要clm达到 50 码(鉴于我不知道这一点A并且J有一列clm)。

PG 中是否有可以做这件事的脚本/查询?

Erw*_*ter 7

只需使用textor varchar,而不是varchar(n)。如果您确实需要将列限制为最大长度,请使用CHECK约束。相关回答:

不管怎样,基本的说法是:

ALTER TABLE tbl ALTER clm TYPE varchar(50); -- or rather: text
Run Code Online (Sandbox Code Playgroud)

你不需要一个USING带有显式转换指令的子句,只要有一个隐式的 a 注册,这是varchar(n)-> varchar(n)/的情况text。细节:

基于系统目录的脚本:

DO
$do$
DECLARE
    _sql text;
BEGIN
   FOR _sql IN 
      SELECT format('ALTER TABLE %s ALTER %I TYPE varchar(50)'
                   , attrelid::regclass
                   , a.attname)
      FROM   pg_namespace n
      JOIN   pg_class     c ON c.relnamespace = n.oid
      JOIN   pg_attribute a ON a.attrelid = c.oid
      WHERE  n.nspname = 'public'  -- your schema
      AND    a.attname = 'clm'     -- column name (case sensitive!)
      AND    a.attnum > 0
      AND    NOT a.attisdropped
   LOOP
      RAISE NOTICE '%', _sql;  -- debug before you execute
      -- EXECUTE _sql;
   END LOOP;
END
$do$;
Run Code Online (Sandbox Code Playgroud)