Database
 sql >> база данни >  >> RDS >> Database

SQL ALTER TABLE за начинаещи

В 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 операторът ви позволява да преименувате таблица, да преименувате колона в таблица или да добавите нова колона към съществуваща таблица.

Всякакви други промени ще изискват да пуснете таблицата и да започнете отново. Това важи и за добавяне на външни ключове.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL SELECT AND оператор

  2. Присъединете се към 3 таблици в SQL

  3. Още онлайн операции са налични сега или скоро

  4. 0 до 60 :Превключване към индиректни контролни точки

  5. Какво е курсор в SQL и как да го приложим?