#postgresql #types #constraints #alter-table
#postgresql #типы #ограничения #изменить таблицу
Вопрос:
Есть ли способ изменить тип домена и изменить тип на новый тип? У меня есть столбец, использующий домен, который имеет VARCHAR(25)
тип, и я хотел бы увеличить длину до 150.
Комментарии:
1. Вы можете задать этот вопрос на DBA.stackexchange.com вместо этого.
Ответ №1:
Вы не можете. И если вам действительно не нужно — вы не должны (см. Предупреждение ниже).
Что вы хотите сделать, это:
- Переименуйте существующий домен
ALTER DOMAIN domain_name RENAME TO doman_name_depricated;
- Создайте новый домен с тем же именем, что и предыдущий, с новыми ограничениями
CREATE DOMAIN doman_name AS VARCHAR(150);
- Измените тип для всех столбцов, которые используют этот домен.
ALTER TABLE table_name ALTER COLUMN column_name SET DATA TYPE domain_name;
Предупреждение — это возможно только с тех пор, как мы расширяем домен, чтобы каждое значение оставалось действительным. Если вы хотите, например, сократить значение, вы сталкиваетесь с риском того, что значения в ваших таблицах станут недействительными. В этом случае вам нужен какой-нибудь скрипт переноса, чтобы исправить эти значения перед
Ответ №2:
Создайте новый домен, измените все таблицы с новым доменом и удалите старый домен.
Ответ №3:
Одним из способов было бы
- перевести базу данных в автономный режим,
- дамп схемы в виде текста,
- отредактируйте текст, изменив тип домена на varchar(150),
- затем, наконец, перезагрузите схему из текста.
Это всего лишь набросок. Потренируйтесь в изолированной среде, прежде чем использовать это на своей реальной базе данных.
Ответ №4:
Это невозможно, но вы могли бы вроде как сделать это возможным.
В сложившейся ситуации вы используете псевдоним varchar (25) в качестве своего домена.
переменные varchar(25), varchar(50), varchar и text хранятся в Postgres одинаково. Единственным отличием является проверка длины, которая увеличивает накладные расходы на первые два.
Теперь вы не можете изменить тип домена, но вы можете изменить его ограничения — и, что еще лучше, размещение ограничений на доменах является одним из тех «трюков», которые позволяют изменять их, не требуя перезаписи таблицы.
- создайте новый домен, скажем, short_string, который является псевдонимом для varchar с ограничением check
- измените применимые столбцы таблицы и задайте их тип для этого нового домена
Таким образом, если вы передумаете и решите изменить максимальную длину на 40 или 60 или обратно на 25, вы сможете сделать это без перезаписи таблицы.
Комментарии:
1. Где мы можем найти это ограничение? В моем домене у меня есть ограничение проверки, но я не могу найти неявное ограничение размера, созданное с помощью varchar (x)
2. @AmitGoldstein: postgresql.org/docs/current/sql-createdomain.html и затем вы можете увидеть проверки, посмотрев на определение домена (
d
работает, если мне не изменяет память).