PostgreSQL截断现有字段并更改以添加字符限制

时间:2018-05-22 16:33:33

标签: sql postgresql foreach truncate

我正在改变已填充列的现有表。在我的表格'部分'中,我想在列" name"上设置字符限制,特别是键入 VARCHAR(60)。但是,还没有以前是一个字符限制,我想截断名称列中的任何现有字段,以便它现在在我的ALTER脚本之前匹配此限制。

我仍然收到几条错误消息,包括在我的LEFT语句中,这就是我用来截断" name"中的字符串。柱。对于我是否声明要截断的字符串,无论是否将参数放在括号中,LEFT语句都很难过。这是我到目前为止所处的位置:

DO $$
DECLARE
    _name text;
    _id uuid;
BEGIN
    FOR _name, _id IN SELECT (name, id) FROM %SCHEMA%.section
    LOOP
        IF (_name > 60)
        THEN
            SET name = LEFT (_name, 60) WHERE id = _id;
        END IF;
    END LOOP;
    RETURN NEW;
END $$;

完成此操作后,我知道我的ALTER脚本非常简单:

ALTER TABLE IF EXISTS %SCHEMA%.section ALTER COLUMN name TYPE VARCHAR(60);

2 个答案:

答案 0 :(得分:4)

您还可以使用USING语法ALTER TABLE。这允许您将其作为ALTER的一部分,而不是作为两个单独的命令。

ALTER TABLE myschema.mytable 
  ALTER COLUMN mycolumn 
    TYPE VARCHAR(60) 
    USING LEFT(mycolumn, 60);

https://www.postgresql.org/docs/9.6/static/sql-altertable.html

答案 1 :(得分:1)

使用更新查询,如下所示:

UPDATE myschema.mytable
SET name = LEFT(mytable.name, 60)
WHERE LENGTH(mytable.name) > 60