【问题标题】:PostgreSQL truncate existing field and altering to add character limitPostgreSQL 截断现有字段并更改以添加字符限制
【发布时间】:2018-11-01 12:16:16
【问题描述】:

我正在更改已填满列的现有表。在我的表“部分”中,我想在“名称”列上设置字符限制,特别是输入 VARCHAR(60)。 但是,以前没有字符限制,我想截断名称列中的任何现有字段,以便它现在在我的 ALTER 脚本之前匹配此限制。

我仍然收到一些错误消息,包括在我的 LEFT 语句中,这是我用来截断“名称”列中的字符串的内容。 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);

【问题讨论】:

  • 您是否尝试添加括号?像这样: LEFT(_name, 60)
  • 是的,我曾提到在 LEFT 语句中添加括号。当我这样做时,我仍然收到“错误:在“(”“或附近的语法错误

标签: sql postgresql foreach truncate


【解决方案1】:

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

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

【讨论】:

  • 就是这样!所以有一些变化,可能是因为 Postgres 而不是 SQL。在 UPDATE 声明 schema.table 之后,不再需要指定表,在 SET、LEFT 和 WHERE 约束中只需要“名称”。谢谢
  • 最后一件事,我的 Postgres 接受了删除 LEFT 和 WHERE 中的表关系,所以它适用于 LEFT(name, 60) 和 WHERE LENGTH(name) > 60跨度>
  • 是的,这可以在这里工作,因为只有 1 个表和列名不能冲突。
【解决方案2】:

您还可以将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

【讨论】:

    猜你喜欢
    • 2017-06-13
    • 1970-01-01
    • 2012-01-12
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    相关资源
    最近更新 更多