MYSQL – ПРОМЯНА, ИЗПУСКАНЕ, ПРЕИМЕНУВАНЕ, ПРОМЕНЯНЕ
⚡ Умно обобщение
ПРОМЯНА, ОТКАЗ, ПРЕИМЕНУВАНЕ и МОДИФИКАЦИЯ са MySQL команди, които преоформят база данни, след като тя вече е използвана. Те добавят, премахват, преименуват и предефинират обекти като таблици и колони, без да изхвърлят вече съхранените редове.

Какво представлява командата ALTER в MySQL?
- ПРОМЕНИ Командата променя съществуваща база данни, таблица, изглед или друг обект на база данни, който трябва да се промени по време на жизнения цикъл на базата данни. Това е командата, която позволява на схемата да се развива, след като вече е създадена и запълнена с данни.
Бизнес изискванията рядко стоят неподвижно и дизайнът на базата данни трябва да се движи заедно с тях. Да предположим, че дизайнът на базата данни Myflix е внедрен и потребителите работят с нея, и едва тогава екипът осъзнава, че е пропусната жизненоважна информация. Никой не иска да загуби съществуващите редове; те просто искат да запишат новата информация заедно с тях.
ALTER покрива точно тази ситуация. Той може да промени типа данни на поле от низ на число, да преименува поле или да добави изцяло нова колона към таблица, като същевременно данните, които вече са съхранени в таблицата, остават непокътнати.
След като целта на командата е установена, следващата стъпка е синтаксисът, който я изпълнява.
MySQL Синтаксис на ALTER
Основният синтаксис, използван за добавяне на колона към вече съществуваща таблица, е показан по-долу.
ALTER TABLE `table_name` ADD COLUMN `column_name` `data_type`;
ТУК
- „ПРОМИНЯВАНЕ НА ТАБЛИЦА `име_на_таблица`” е командата, която казва MySQL сървър, за да модифицира таблицата с име `table_name`.
- „ДОБАВИ КОЛОНА `име_на_колона` `тип_данни`” е командата, която казва MySQL сървърът да добави нова колона с име `column_name` с тип данни `data_type`.
Да предположим, че Myflix е въвел онлайн фактуриране и плащания. За да се поддържа това, към таблицата с членове трябва да се добави поле за номера на кредитната карта. Преди да се правят каквито и да е промени, си струва да се разгледа структурата на таблицата в сегашния ѝ вид. Скриптът, показан по-долу, прави това.
SHOW COLUMNS FROM `members`;
| Област | Тип | Null | ключ | По подразбиране | екстра - Extra |
|---|---|---|---|---|---|
| членски_номер | int (11) | НЕ | PRI | NULL | автоматично_увеличение |
| пълни_имена | varchar (350) | НЕ | NULL | ||
| пол | varchar (6) | ДА | NULL | ||
| дата_на_раждане | дата | ДА | NULL | ||
| физически_адрес | varchar (255) | ДА | NULL | ||
| пощенски_адрес | varchar (255) | ДА | NULL | ||
| номер_на_контакт | varchar (75) | ДА | NULL | ||
| електронна поща | varchar (255) | ДА | NULL |
💡 Забележка за int(11): Числото в скобите е само ширината на дисплея. MySQL Версия 8.0.17 го отхвърли за целочислени типове, така че съвременните сървъри отчитат тази колона просто като IntРазмерът на хранилището е непроменен.
Показаният по-долу скрипт добавя новото поле към таблицата members.
ALTER TABLE `members` ADD COLUMN `credit_card_number` VARCHAR(25);
Изпълнението на този скрипт спрямо myflixdb добавя колона с име credit_card_number към таблицата members с тип данни VARCHAR. Повторното изпълнение на скрипта SHOW COLUMNS дава следния резултат.
| Област | Тип | Null | ключ | По подразбиране | екстра - Extra |
|---|---|---|---|---|---|
| членски_номер | int (11) | НЕ | PRI | NULL | автоматично_увеличение |
| пълни_имена | varchar (350) | НЕ | NULL | ||
| пол | varchar (6) | ДА | NULL | ||
| дата_на_раждане | дата | ДА | NULL | ||
| физически_адрес | varchar (255) | ДА | NULL | ||
| пощенски_адрес | varchar (255) | ДА | NULL | ||
| номер_на_контакт | varchar (75) | ДА | NULL | ||
| електронна поща | varchar (255) | ДА | NULL | ||
| номер_на_кредитна_карта | varchar (25) | ДА | NULL |
Маркираният ред потвърждава, че credit_card_number е добавен към таблицата members и данните, които вече се намират в другите колони, не са засегнати от добавянето.
Добавянето на колона е само половината от работата. Схемата също така трябва да се отърве от обекти, от които вече не се нуждае, което е задачата на командата DROP.
Какво представлява командата DROP? MySQL?
Командата DROP изтрива обект завинаги. Използва се за
- Изтриване на база данни от MySQL сървър.
- Изтриване на обект, като например таблица или колона, от база данни.
⚠️ Предупреждение: DROP не е обратима. Нито обектът, нито редовете в него могат да бъдат възстановени без резервно копие, така че изпълнете SELECT спрямо целта и първо потвърдете резервното копие.
Спадping колона
В горния пример с ALTER, към таблицата members е добавена колона с име credit_card_number. Да предположим, че функцията за онлайн фактуриране е отложена и тази колона трябва да бъде премахната отново. Следният скрипт го прави.
ALTER TABLE `members` DROP COLUMN `credit_card_number`;
Изпълнението на скрипта премахва колоната credit_card_number от таблицата members. Повторното изброяване на колоните потвърждава резултата.
SHOW COLUMNS FROM `members`;
| Област | Тип | Null | ключ | По подразбиране | екстра - Extra |
|---|---|---|---|---|---|
| членски_номер | int (11) | НЕ | PRI | NULL | автоматично_увеличение |
| пълни_имена | varchar (350) | НЕ | NULL | ||
| пол | varchar (6) | ДА | NULL | ||
| дата_на_раждане | дата | ДА | NULL | ||
| физически_адрес | varchar (255) | ДА | NULL | ||
| пощенски_адрес | varchar (255) | ДА | NULL | ||
| номер_на_контакт | varchar (75) | ДА | NULL | ||
| електронна поща | varchar (255) | ДА | NULL |
Номерът на кредитната карта е премахнат от списъка с полета.
ИЗПУСКАНЕ МАСА
Синтаксисът за премахване на цяла таблица от база данни е следният.
DROP TABLE `sample_table`;
Приложено към реален обект, твърдението изглежда така.
DROP TABLE `categories_archive`;
Изпълнението му изтрива таблицата с име `categories_archive` и всеки ред в нея от базата данни.
ПРЕКРАТЯВАНЕ НА БАЗА ДАННИ
Същата ключова дума премахва цяла схема. Добавянето на IF EXISTS потиска грешката, която MySQL повдига, когато целта вече е изчезнала, което е полезно в скриптове, които се изпълняват повече от веднъж.
DROP DATABASE IF EXISTS `myflixdb_backup`;
Премахването на обект е окончателно. Когато самият обект трябва да оцелее и само името му е грешно, командата RENAME е правилният инструмент.
Какво представлява командата RENAME в MySQL?
Командата RENAME променя името на съществуващ обект в базата данни, като например таблица или колона, на ново име. Преименуването на таблица не води до загуба на данни, съдържащи се в нея.
Командата има следния основен синтаксис.
RENAME TABLE `current_table_name` TO `new_table_name`;
За да преименувате таблицата movierentals на movie_rentals, се използва скриптът по-долу.
RENAME TABLE `movierentals` TO `movie_rentals`;
Изпълнението му преименува таблицата `movierentals` на `movie_rentals`. Тъй като преименуването е само промяна на етикета, същият оператор, обърнат в обратна посока, възстановява оригиналното име.
RENAME TABLE `movie_rentals` TO `movierentals`;
RENAME TABLE обработва името на таблица. Преименуване на колонаи промяната на това, което съдържа, е дело на ключовата дума CHANGE.
ПРОМЯНА на ключова дума
Ключовата дума CHANGE ви позволява да
- Промяна на името на колона
- Промяна на типа данни на колоната
- Промяна на ограниченията на колоните
Да разгледаме един пример. Полето full_names в таблицата members е от тип данни varchar с ширина 350, както потвърждава скриптът по-долу.
SHOW COLUMNS FROM `members`;
| Област | Тип | Null | ключ | По подразбиране | екстра - Extra |
|---|---|---|---|---|---|
| членски_номер | int (11) | НЕ | PRI | NULL | автоматично_увеличение |
| пълни_имена | varchar (350) | НЕ | NULL | ||
| пол | varchar (6) | ДА | NULL | ||
| дата_на_раждане | дата | ДА | NULL | ||
| физически_адрес | varchar (255) | ДА | NULL | ||
| пощенски_адрес | varchar (255) | ДА | NULL | ||
| номер_на_контакт | varchar (75) | ДА | NULL | ||
| електронна поща | varchar (255) | ДА | NULL |
Да предположим, че изискването е да
- Променете името на полето от „full_names“ на „fullname“
- Променете го на типа данни char с ширина 250
- Добавете ограничение NOT NULL
И трите редакции се извършват с една единствена команда CHANGE.
ALTER TABLE `members` CHANGE COLUMN `full_names` `fullname` char(250) NOT NULL;
Изпълнението му спрямо myflixdb и последващото изпълнение на скрипта SHOW COLUMNS дава следния резултат.
| Област | Тип | Null | ключ | По подразбиране | екстра - Extra |
|---|---|---|---|---|---|
| членски_номер | int (11) | НЕ | PRI | NULL | автоматично_увеличение |
| пълно име | символ (250) | НЕ | NULL | ||
| пол | varchar (6) | ДА | NULL | ||
| дата_на_раждане | дата | ДА | NULL | ||
| физически_адрес | varchar (255) | ДА | NULL | ||
| пощенски_адрес | varchar (255) | ДА | NULL | ||
| номер_на_контакт | varchar (75) | ДА | NULL | ||
| електронна поща | varchar (255) | ДА | NULL |
Колоната вече се нарича fullname, съдържа char(250) и отхвърля NULL стойности.
ПРОМЕНИ ключова дума
Ключовата дума MODIFY ви позволява да
- Промяна на типа данни на колоната
- Променете ограниченията на колоните
В примера CHANGE по-горе, името на полето трябваше да бъде предоставено два пъти, въпреки че преименуването беше само част от целта. Пропускането на името на полето от оператор CHANGE генерира грешка. Когато само типът данни и ограниченията се нуждаят от корекция и името трябва да остане такова, каквото е, MODIFY върши работата с едно споменаване на колоната.
Скриптът по-долу променя ширината на полето „пълно име“ от 250 на 50.
ALTER TABLE `members` MODIFY `fullname` char(50) NOT NULL;
Изпълнението му спрямо myflixdb и последващото изпълнение на скрипта SHOW COLUMNS дава резултата, показан по-долу.
| Област | Тип | Null | ключ | По подразбиране | екстра - Extra |
|---|---|---|---|---|---|
| членски_номер | int (11) | НЕ | PRI | NULL | автоматично_увеличение |
| пълно име | символ (50) | НЕ | NULL | ||
| пол | varchar (6) | ДА | NULL | ||
| дата_на_раждане | дата | ДА | NULL | ||
| физически_адрес | varchar (255) | ДА | NULL | ||
| пощенски_адрес | varchar (255) | ДА | NULL | ||
| номер_на_контакт | varchar (75) | ДА | NULL | ||
| електронна поща | varchar (255) | ДА | NULL |
⚠️ Предупреждение: Стесняването на колона отрязва данните, които вече не се побират. Всяко име, по-дълго от 50 знака, се съкращава от този оператор, така че проверете най-дългата съществуваща стойност с МАРКИРАЙ заявка преди свиване на поле.
ПРОМЯНА срещу ПРОМЯНА срещу ПРЕИМЕНУВАНЕ НА КОЛОНА
Трите ключови думи се припокриват и изборът на грешна е най-честият източник на грешки в тази област. Таблицата по-долу ги поставя една до друга.
| Ключова дума | Преименува колоната | Променя типа и ограниченията | Необходимо е старо име | Типична употреба |
|---|---|---|---|---|
| ПРОМЯНА | Да | Да | Да, плюс новото име | Преименуване и предефиниране с едно изречение |
| МОДИФИЦИРАЙТЕ | Не | Да | Име, дадено веднъж | Разширяване, стесняване или пренаписване на колона |
| ПРЕИМЕНУВАНЕ НА КОЛОНА | Да | Не | Да, плюс новото име | Само преименуване, от MySQL 8.0 нататък |
MySQL Версия 8.0 добави четвърта опция за най-простия случай - преименуване без никакво предефиниране.
ALTER TABLE `members` RENAME COLUMN `fullname` TO `full_name`;
Типът и името са уточнени. Оставащият въпрос е къде се поставя нова колона в таблицата, което се контролира от ключовата дума AFTER.
СЛЕД ключова дума
По подразбиране колона, добавена с ALTER TABLE, се поставя в края на таблицата. За да се постави на определена позиция, командата ALTER се комбинира с ключовата дума AFTER.
Скриптът по-долу добавя „date_of_registration“ директно след date_of_birth в таблицата с членове.
ALTER TABLE `members` ADD `date_of_registration` date NULL AFTER `date_of_birth`;
Изпълнението му спрямо myflixdb и последващото изпълнение на скрипта SHOW COLUMNS дава резултата, показан по-долу.
| Област | Тип | Null | ключ | По подразбиране | екстра - Extra |
|---|---|---|---|---|---|
| членски_номер | int (11) | НЕ | PRI | NULL | автоматично_увеличение |
| пълно име | символ (50) | НЕ | NULL | ||
| пол | varchar (6) | ДА | NULL | ||
| дата_на_раждане | дата | ДА | NULL | ||
| дата_на_регистрация | дата | ДА | NULL | ||
| физически_адрес | varchar (255) | ДА | NULL | ||
| пощенски_адрес | varchar (255) | ДА | NULL | ||
| номер_на_контакт | varchar (75) | ДА | NULL | ||
| електронна поща | varchar (255) | ДА | NULL |
Маркираният ред е колоната, добавена след date_of_birth. Ключовата дума FIRST работи по същия начин и премества новата колона в самото начало на таблицата.
