PostgreSQL обрезает существующее поле и изменяет его, чтобы добавить ограничение на количество символов - PullRequest
0 голосов
/ 22 мая 2018

Я изменяю свою существующую таблицу, которая уже заполнена столбцами.В моей таблице 'section' я хочу установить ограничение на количество символов в столбце "name", в частности наберите 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);

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Вы также можете использовать синтаксис 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

0 голосов
/ 22 мая 2018

используйте запрос на обновление, например:

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