Как переименовать столбец таблицы не нарушая целостности
Переименование столбца таблицы или представления – не самая частая операция, которую приходится проделывать разработчику SQL. Но, когда такая необходимость возникает, то как это сделать легко и без дополнительных усилий?
Сама по себе операция переименования столбца – не сложная. Для переименования столбца TerritoryID в таблице Sales.SalesTerritory на новое название TerID, достаточно выполнить следующий скрипт:
EXECUTE sp_rename 'Sales.SalesTerritory.TerritoryID', 'TerrID', 'COLUMN';
Проблемы начнутся после, когда вы получите следующее предупреждение:
Caution: Changing any part of an object name could break scripts and stored procedures. (Изменение любой части имени объекта может разрушить скрипты и хранимые процедуры)
Либо даже сообщение такого содержания:
Object ‘Sales.SalesTerritory.TerritoryID’ cannot be renamed because the object participates in enforced dependencies. (Объект “Sales.SalesTerritory.TerritoryID” не может быть переименован, потому что он участвует в принудительных зависимостях)
В каких ситуация могут быть такие последствия?
Предположим, что у вас есть хранимая процедура Sales.vTer, который ссылается на столбец TerritoryID в таблице Sales.SalesTerritory. Процедура sp_rename переименует только колонку TerritoryID в таблице Sales.SalesTerritory, но в процедуре останется упоминание о старом наименовании колонки.
Таким образом, таблица Sales.SalesTerritory будет содержать столбец TerrID, но хранимая процедура будет обращаться к колонке Sales.SalesTerritory.TerritoryID, которой больше не существует. Работоспособность процедуры будет нарушена.
Что такое принудительные зависимости?
Зависимость является принудительной («enforced»), когда ссылающийся объект, привязанный к схеме (schema-bound) выражения. Это сообщение также показывает, что есть другие объекты, которые вы должны удалить и заново создать с новым именем столбца.
Как найти хранимые процедуры и другие объекты, которые будут затронуты переименованием столбца?
В SQL Server Management Studio можно отслеживать зависимости, с помощью просмотра зависимостей – View Dependencies option. Вы сможете получить список зависимостей, но переименовывать вам придётся вручную каждый объект, в котором есть ссылка на столбец.
Чтобы переименовать столбец, используя sp_rename, вам необходимо:
- Найти все зависимые объекты, которые ссылаются на столбец таблицы/представления.
- Удалить все принудительные зависимости (WITH SCHEMABINDING)
- Переименовать столбец, используя sp_rename
- Восстановить все зависимости, которые вы удалили на 2-ом шаге
- Если вам необходимо переименовать ещё один столбец, то необходимо повторить шаги с 1-ого по 4-ый.
Не самый приятный процесс, который заставляет подумать, прежде чем решить всё-таки переименовать столбцы в таблице.
Как переименовать столбец без особых хлопот?
ApexSQL Search может решить все ваши проблемы, связанные с переименованием столбцов. Это БЕСПЛАТНЫЙ компонент (add-in) для SQL Server Management Studio и для Visual Studio, который умеет находить по заданному тексту объекты базы данных и данные в таблицах и представлениях. Позволяет изменять таблицы, представления, хранимые процедуры, функции, колонны, имена параметров и схем, не нарушая зависимостей и целостности БД, визуализируя все объектные взаимосвязи.
- Запустите Open SQL Server Management Studio или Visual Studio.
- В Object Explorer/Server Explorer, перейдите к таблице или представлению, чьи колонки вы хотите переименовать.
- Щелкните правой кнопкой мыши на столбце и выберите Safe rename в меню ApexSQL Search:
- Чтобы увидеть изменения, которые будут выполняться, нажмите кнопку Generate preview в окне Safe rename column.
- На вкладке Generated script можно увидеть скрипт, который будет выполняться, чтобы переименовать столбец.

- Откройте вкладку Warnings, чтобы увидеть информацию о потенциальных проблемах, которые могут встретиться в процессе переименования.

- Откройте вкладку Sequence, чтобы увидеть все действия, которые будут выполняться в процессе переименование. Эти действия вам пришлось бы проделать вручную, если бы вы использовали процедуру sp_rename.

- Откройте вкладку Dependencies, чтобы увидеть объекты, которые зависят от переименования колонки. Это объекты, которые будут автоматически модифицированны, для сохранения целостности, чтобы не нарушать все ссылки. Если бы вы использовали процедуру sp_rename, вам пришлось бы вручную найти их все и изменить.

- Если вы хотите изменить сценарий, прежде чем его выполнить, нажмите кнопку Open. Этот сценарий будет открыт в редакторе SQL Server Management Studio/ Visual Studio. После просмотра или модификации вы можете выполнить скрипт Execute или сохранить его в файл.
- Для выполнения сценария по переименовании нажмите Rename.
Переименование столбца не тривиальная задача, но вы можете легко её выполнить, если использовать БЕСПЛАТНЫЙ инструмент ApexSQL Search. Вам не потребуется вручную анализировать всю вашу БД на наличие связей и зависимостей. ApexSQL Search всё сделает за вас. Она найдёт все связанные объекты, переименует и пересоздаст все зависимости, чтобы не нарушить целостность базы данных.
Related posts:
Как изменить столбец в MySQL
Цель данного руководства или статьи рассмотреть изменение некоторых качеств столбцов или колонок в таблице MySQL, а именно:
- Переименование столбца;
- Изменение типа данных столбца;
- Изменить положение столбца относительно других столбцов.
Все эксперименты работают как на MySQL версии 5.7 так и на версии 8. И абсолютно не важно какая операционная система: Windows XP, 7, 8, 8.1, 10, Linux и т.д. Если удалось установить MySQL на вашу операционную систему, то будьте уверены, всё что будет описано ниже у вас сработает.
Предварительно создам тестовую таблицу «articles» в тестовой базе «testdb» для экспериментов:
итак, создаём таблицу:
CREATE DATABASE IF NOT EXISTS testdb;

USE testdb;
CREATE TABLE IF NOT EXISTS articles ( ID INT UNSIGNED AUTO_INCREMENT , Title VARCHAR(30) , Content VARCHAR(30) , CONSTRAINT PK_articles_id PRIMARY KEY (ID) ) engine=innodb DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Заполним таблицу articles тестовыми данными:
I NSERT INTO articles (Title, Content) VALUES ('Статья 1','Текст статьи 1'), ('Статья 2','Текст статьи 2'), ('Статья 3','Текст статьи 3'), ('Статья 4','Текст статьи 4'), ('Статья 5','Текст статьи 5');
Вышеуказанный код система безопасности не пропускает, пришлось вставить пробел в «I NSERT», если будете копировать данный код, преобразуйте слово «I NSERT» в «INSERT» и у вас всё заработает.

Ну что ж, теперь притупим к основной цели данного руководства.
Для переименования понадобится оператор ALTER TABLE с CHANGE [COLUMN] и MODIFY [COLUMN].
Ознакотесь также со скрином из официальной документации:

Переименуем колонку Content в content1 в таблице articles:
ALTER TABLE articles CHANGE content content1 VARCHAR(30);

К сожалению при использовании CHANGE даже если просто необходимо изменить название столбца, всё равно приходится указывать тип данных и если тип данных не нужно менять, тогда нужно указать тот же самый тип данных, который уже есть в таблице у этого столбца.
Теперь попробуем изменить имя столбца content1 на Content но без указания типа дынных и посмотрим что получится:
ALTER TABLE articles CHANGE content1 Content;

без указания типа данных переименование завершается ошибкой!
Переименуем данную колонку content1 в Content и изменим тим данных varchar(30) на тип данных TEXT:
ALTER TABLE articles CHANGE content1 Content TEXT;

Изменим положение колонки Content, а именно, поместим её после столбца ID также снова изменим имя и тип данных, чтобы посмотреть работу этих параметров в совокупности:
ALTER TABLE articles CHANGE Content Content35 VARCHAR(256) AFTER ID;

Хотелось бы сразу уточнить, что я не понял как работает параметр FIRST:

Запрос с FIRST заканчитвается ошибкой. Так что если есть необходимость какой-либо столебц поставить на 1-е место, например тот же Content, то его надо поставить сначала на 2- место, т.е. после ID, а затем уже с помощью AFTER поставить ID после Content:
ALTER TABLE articles CHANGE Content35 Content TEXT; ALTER TABLE articles CHANGE ID ID INT UNSIGNED AFTER Content;

Первым запросом изменил только имя столбца и тип данных, а поскольку он уже был на втором месте, то AFTER не испоользовал. Вторым запросом столбец ID был помещён на второе место.
Переходим к параметру MODIFY в ALTER TABLE.
MODIFY может изменить только тип данных колонки и расположение в таблице относительно других столбцов, например поместим Content после Title и изменим тип данных с TEXT на MEDIUMTEXT:
ALTER TABLE articles MODIFY Content MEDIUMTEXT AFTER Title;

Также можно изменить тип данных не меняя положения относительно других столбцов:
ALTER TABLE articles MODIFY Content TEXT;

ALTER TABLE articles MODIFY Content TEXT AFTER ID;

c FIRST та же проблема, почему-то не работает:

Итог: Переименование столбцов, их типов данных и положения относительно других столбцов с помощью ALTER TABLE CHANGE/MODIFY корректно работает, кроме параметра FIRST.
Переименование столбцов при LEFT JOIN
Если переименовать поле в выходном наборе — то, как уже отвечено, алиас в помощь. Если же надо переименовать поле в таблице — то одним запросом это невозможно.
7 апр 2018 в 20:46
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Естественно, любой столбец можно переименовать. Но для этого в секции запроса SELECT надо вместо использования * перечислить нужные столбцы (если нужны все столбцы, то перечисляем все). И тогда для каждого столбца можно указать псевдоним (alias). Например: SELECT table2.id AS your_alias FROM . . Псевдонимы можно задавать как с помощью AS , так и без него.
Отслеживать
ответ дан 7 апр 2018 в 12:32
Yury Plinto Yury Plinto
787 1 1 золотой знак 4 4 серебряных знака 15 15 бронзовых знаков
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как переименовать столбец в sql
Если таблица уже была ранее создана, и ее необходимо изменить, то для этого применяется команда ALTER TABLE . Она поддерживает различные опции и возможности. Рассмотрим лишь основные сценарии, с которыми мы можем столкнуться.
Переименование таблицы
Для переименования таблицы применяется операторы RENAME TO , после которого указывается новое имя таблицы:
ALTER TABLE users RENAME TO people;
Здесь таблица users переименовывается в «people».
Добавление нового столбца
Добавим в таблицу users новый столбец email:
ALTER TABLE users ADD COLUMN email TEXT NOT NULL;
В данном случае столбец email имеет тип TEXT и для него определено ограничение NOT NULL .
Переименование столбца
Переименуем столбец email в login
ALTER TABLE users RENAME COLUMN email TO login;
Удаление столбца
Удалим столбец login из таблицы users:
ALTER TABLE users DROP COLUMN login;
