Изменить тип изменения домена

#postgresql #types #constraints #alter-table

#postgresql #типы #ограничения #изменить таблицу

Вопрос:

Есть ли способ изменить тип домена и изменить тип на новый тип? У меня есть столбец, использующий домен, который имеет VARCHAR(25) тип, и я хотел бы увеличить длину до 150.

Комментарии:

1. Вы можете задать этот вопрос на DBA.stackexchange.com вместо этого.

Ответ №1:

Вы не можете. И если вам действительно не нужно — вы не должны (см. Предупреждение ниже).

Что вы хотите сделать, это:

  1. Переименуйте существующий домен
 ALTER DOMAIN domain_name RENAME TO doman_name_depricated;
  
  1. Создайте новый домен с тем же именем, что и предыдущий, с новыми ограничениями
 CREATE DOMAIN doman_name AS VARCHAR(150);
  
  1. Измените тип для всех столбцов, которые используют этот домен.
 ALTER TABLE table_name ALTER COLUMN column_name SET DATA TYPE domain_name;
  

Предупреждение — это возможно только с тех пор, как мы расширяем домен, чтобы каждое значение оставалось действительным. Если вы хотите, например, сократить значение, вы сталкиваетесь с риском того, что значения в ваших таблицах станут недействительными. В этом случае вам нужен какой-нибудь скрипт переноса, чтобы исправить эти значения перед

Ответ №2:

Создайте новый домен, измените все таблицы с новым доменом и удалите старый домен.

Ответ №3:

Одним из способов было бы

  1. перевести базу данных в автономный режим,
  2. дамп схемы в виде текста,
  3. отредактируйте текст, изменив тип домена на varchar(150),
  4. затем, наконец, перезагрузите схему из текста.

Это всего лишь набросок. Потренируйтесь в изолированной среде, прежде чем использовать это на своей реальной базе данных.

Ответ №4:

Это невозможно, но вы могли бы вроде как сделать это возможным.

В сложившейся ситуации вы используете псевдоним varchar (25) в качестве своего домена.

переменные varchar(25), varchar(50), varchar и text хранятся в Postgres одинаково. Единственным отличием является проверка длины, которая увеличивает накладные расходы на первые два.

Теперь вы не можете изменить тип домена, но вы можете изменить его ограничения — и, что еще лучше, размещение ограничений на доменах является одним из тех «трюков», которые позволяют изменять их, не требуя перезаписи таблицы.

  1. создайте новый домен, скажем, short_string, который является псевдонимом для varchar с ограничением check
  2. измените применимые столбцы таблицы и задайте их тип для этого нового домена

Таким образом, если вы передумаете и решите изменить максимальную длину на 40 или 60 или обратно на 25, вы сможете сделать это без перезаписи таблицы.

Комментарии:

1. Где мы можем найти это ограничение? В моем домене у меня есть ограничение проверки, но я не могу найти неявное ограничение размера, созданное с помощью varchar (x)

2. @AmitGoldstein: postgresql.org/docs/current/sql-createdomain.html и затем вы можете увидеть проверки, посмотрев на определение домена ( d работает, если мне не изменяет память).