В SQL, ALTER TABLE
оператор променя дефиницията на съществуваща таблица.
Можете да използвате ALTER TABLE
за промяна, добавяне или отпадане на колони и ограничения.
В зависимост от вашата СУБД, ALTER TABLE
операторът може също да се използва за преназначаване и повторно изграждане на дялове или за деактивиране и активиране на ограничения и задействания.
Синтаксис
ALTER TABLE
изявлението обикновено звучи така:
ALTER TABLE table_name
[alter_option [, alter_option] ...]
[partition_options]
Къде:
table_name
е името на таблицата, която искате да промените.[alter_option [, alter_option] …]
е списък на конкретните промени, които искате да направите (напримерADD
последвано от името и дефиницията на колоната илиDROP COLUMN
последвано от името на колоната и т.н.).[partition_options]
е незадължителен списък с опции специално за разделени таблици. Не всички СУБД поддържат разделени таблици. Ако вашият го прави, такива опции може да ви позволят да добавяте, пускате, отхвърляте, импортирате, обединявате или разделяте дялове или да извършвате поддръжка на дялове.
Пълният синтаксис за ALTER TABLE
може да бъде доста сложен и варира значително между СУБД. За всичко, което не е обхванато в тази статия, вижте документацията на вашата СУБД.
По-долу са дадени примери за най-често срещаните ALTER TABLE
операции.
Добавяне на нова колона
За да добавите нова колона към таблица, използвайте ADD
клауза, последвана от името на колоната и типа данни.
ALTER TABLE Products
ADD ProductDescription varchar(500);
Това добавя нова колона, наречена ProductDescription
към Products
таблица.
В този пример направихме колоната varchar(500)
но бихте използвали всеки тип данни, който е подходящ за вашата нова колона.
Можете също да включите ограничения в дефиницията на колоната си, но това може да зависи от вашата СУБД и дали таблицата вече съдържа данни (вижте дискусията по-долу за това).
Преименувайте колона
Повечето от основните RDBMS (PostgreSQL, Oracle, SQLite, MySQL 8.0+, MariaDB 10.5.2+) ви позволяват да преименувате колона по следния начин:
ALTER TABLE table_name
RENAME COLUMN column_name TO new_column_name;
Ако използвате MySQL преди версия 8.0 или MariaDB преди 10.5.2+, ще трябва да използвате CHANGE COLUMN
вместо това синтаксис, който също изисква да укажете повторно типа данни. Като това:
ALTER TABLE table_name
CHANGE COLUMN old_column_name new_column_name datatype;
В SQL Server ще трябва да използвате sp_rename
съхранена процедура за преименуване на колона. Като това:
EXEC sp_rename 'schema_name.table_name.column_name', 'new_column_name', 'COLUMN';
Пуснете колона
За да пуснете колона, използвайте DROP COLUMN
клауза, последвана от името на колоната.
ALTER TABLE table_name
DROP COLUMN column_name;
Промяна на определението на колона
Синтаксисът за промяна на дефиницията на съществуваща колона варира значително между СУБД. Зависи и какви промени трябва да направите.
За да направим нещата прости, нека направим проста модификация на колона в SQL Server:
ALTER TABLE Products
ALTER COLUMN ProductDescription varchar(1000);
В този пример променихме ProductDescription
колона от varchar(500)
към varchar(1000)
.
По-долу е показан основният синтаксис, изискван от всяка СУБД за извършване на същите или подобни промени.
SQL Server:
ALTER TABLE table_name
ALTER COLUMN column_name datatype;
PostgreSQL:
ALTER TABLE table_name
ALTER COLUMN column_name TYPE datatype;
MySQL, MariaDB и Oracle преди 10g:
ALTER TABLE table_name
MODIFY COLUMN column_name datatype;
В Oracle 10g и по-нови версии:
ALTER TABLE table_name
MODIFY column_name datatype;
SQLite няма да ви позволи да промените колона, освен да я преименувате.
Действителният синтаксис за всяка СУБД обикновено е много по-сложен от този и зависи от това какво точно се опитвате да направите. Това обаче трябва да ви помогне да започнете с основни модификации на колони.
Ограничения и съображения
Като цяло трябва да избягвате да правите модификации на таблици, след като съдържат данни. Правейки промени, рискувате да загубите съществуващи данни.
Като се има предвид това, много СУБД всъщност ви пречат да правите определени промени, след като таблицата съдържа данни. Например, може да откриете, че не можете да добавите NOT NULL
ограничение към колона, която съдържа данни.
Някои СУБД могат да ви позволят да го направите, стига да използвате DEFAULT
ограничение (за предоставяне на стойност по подразбиране за колони, които не са имали изрично вмъкнати данни в тях), или колона за самоличност/автоматично увеличаване, или колона с времеви печат и т.н.
Някои СУБД не ви позволяват да пускате или променяте колони в таблица.
Освен това някои СУБД ограничават типовете данни, които могат да се добавят.
Пример – Добавяне на ограничение NOT NULL
Ето пример, който да ви помогне да демонстрирате горните точки.
Ето какво се случва, когато се опитам да добавя колона с NOT NULL
ограничение в SQL Server.
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL;
Резултат:
Msg 4901, Level 16, State 1, Line 1 ALTER TABLE only allows columns to be added that can contain nulls, or have a DEFAULT definition specified, or the column being added is an identity or timestamp column, or alternatively if none of the previous conditions are satisfied the table must be empty to allow addition of this column. Column 'ProductDescription' cannot be added to non-empty table 'Products' because it does not satisfy these conditions.
По принцип таблицата вече съдържа данни и така SQL Server връща грешка, която ми казва, че мога да добавя само NOT NULL
ограничение, ако таблицата удовлетворява определени критерии и все още не удовлетворява тези критерии.
И има основателна причина за тези критерии.
A NOT NULL
ограничението гарантира, че няма NULL
стойности в колоната във всеки ред. Проблемът е, че вече имаме данни в таблицата и ако добавим нова колона, тези съществуващи редове ще бъдат NULL
– което незабавно ще наруши нашия NOT NULL
ограничение. Така че трябва да посочим данни, за да влезем в съществуващите редове.
За да направим това, можем да добавим DEFAULT
ограничение или подобно, за да се гарантира, че всички съществуващи редове се попълват автоматично с данни в тази колона.
Пример:
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL DEFAULT 'N/A';
Това просто добавя DEFAULT
ограничение към колоната. Това ограничение гарантира, че всички редове съдържат стойност (в този случай стойността е N/A
), ако не им е присвоена стойност. Това означава, че нашият NOT NULL
ограничението няма да бъде нарушено, защото всички съществуващи редове вече ще съдържат стойност.
Ако новата колона трябва да има уникални, нарастващи стойности, вместо това можете да я направите IDENTITY
колона (или AUTOINCREMENT
в SQLite и други СУБД).
Ако обаче таблицата все още не съдържа данни, може да сте в състояние да добавите колоната, без да се налага да правите някоя от тези стъпки.
Опции за дял
Тази статия е насочена към начинаещи, а разделените таблици са малко извън сферата на урока за начинаещи.
След като казах това, бързо ще разгледам някои от опциите за разделяне по отношение на ALTER TABLE
изявление.
Ако вашата СУБД поддържа разделени таблици, тя вероятно предоставя и опции за дял с ALTER TABLE
изявление.
Например в MySQL можете да направите следното:
ALTER TABLE Products
PARTITION BY HASH(ProductId)
PARTITIONS 8;
Това разделя таблицата на 8 дяла чрез HASH
, като използвате ProductId
колона като ключ за разделяне.
PARTITION BY HASH
използва останалата част от израза (в този случай ProductId
колона), разделено на броя на дяловете (т.е. модула).
Можете също да използвате дялове за диапазон. Ето как можете да добавите дял на диапазон към съществуваща таблица:
ALTER TABLE Products
ADD PARTITION (PARTITION Partition9 VALUES LESS THAN (2020));
Този пример предполага, че Products
таблицата вече има 8 дяла за диапазон и ние добавяме друг дял, наречен Partition9
.
Можете да пуснете дялове по следния начин:
ALTER TABLE Products
DROP PARTITION Partition8, Partition9;
Имайте предвид, че тези примери са за MySQL.
Написах също няколко статии относно разделени таблици в SQL Server. По отношение на ALTER TABLE
изявление, ето как да превключите дял и ето как да превключите в дял (и двете се правят с ALTER TABLE
).
В SQL Server някои опции за дял трябва да бъдат направени с други изрази. Например обединяването на дялове се извършва с ALTER PARTITION FUNCTION
оператор и разделянето на дяловете се извършва с ALTER PARTITION SCHEME
изявление.
Ако искате да научите повече за разделените таблици в SQL Server, ето как да създадете разделена таблица в SQL Server.
ALTER TABLE
в SQLite
Трябва също да спомена, че SQLite има много ограничена поддръжка на ALTER TABLE
изявление. В SQLite ALTER TABLE
операторът ви позволява да преименувате таблица, да преименувате колона в таблица или да добавите нова колона към съществуваща таблица.
Всякакви други промени ще изискват да пуснете таблицата и да започнете отново. Това важи и за добавяне на външни ключове.