W SQL, jeśli chcesz usunąć kolumnę z tabeli, musisz użyć ALTER TABLE
oświadczenie z DROP COLUMN
klauzula.
Spowoduje to usunięcie kolumny i wszystkich jej danych.
Składnia
Składnia wygląda tak:
ALTER TABLE table_name
DROP COLUMN column_name;
Niektóre RDBMS akceptują opcjonalny IF EXISTS
argument, co oznacza, że nie zwróci błędu, jeśli kolumna nie istnieje.
Niektóre RDBMS akceptują również opcjonalną CASCADE
i RESTRICT
argumenty, które określają, co zrobić, jeśli kolumna ma jakiekolwiek zależności. Więcej informacji na ten temat znajdziesz poniżej.
Przykład
Oto przykład do zademonstrowania.
ALTER TABLE Products
DROP COLUMN ProductDescription;
Spowoduje to usunięcie ProductDescription
kolumna z Products
tabela.
Karta IF EXISTS
Argument
W zależności od RDBMS, możesz być w stanie użyć IF EXISTS
argument, który warunkowo usuwa kolumnę tylko wtedy, gdy już istnieje.
Zaletą tego jest to, że nie otrzymasz błędu, jeśli kolumna nie istnieje.
Przykład:
ALTER TABLE Products
DROP COLUMN IF EXISTS ProductDescription;
Ogranicz zmianę
W zależności od RDBMS, możesz być w stanie użyć CASCADE
i RESTRICT
argumenty, aby określić, co zrobić, jeśli kolumna ma jakiekolwiek zależności, takie jak klucze obce lub widoki.
RESTRICT
jest to zwykle zachowanie domyślne, więc jeśli nie określisz żadnego z tych argumentów, DBMS odmówi usunięcia kolumny, jeśli istnieją jakiekolwiek obiekty zależne.
Przykład:
ALTER TABLE Products
DROP COLUMN ProductDescription RESTRICT;
Podczas korzystania z powyższej instrukcji, jeśli kolumna ma jakiekolwiek zależności, operacja upuszczania zakończy się niepowodzeniem i otrzymasz błąd.
Oto błąd, który pojawia się w PostgreSQL podczas próby usunięcia tabeli, do której odwołuje się widok:
cannot drop column productdescription of table products because other objects depend on it
Kaskaduj zmiany
Korzystanie z CASCADE
opcja spowoduje usunięcie wszystkich zależnych obiektów.
Oto co się stanie, jeśli zmienię poprzedni przykład na CASCADE
:
ALTER TABLE Products
DROP COLUMN ProductDescription CASCADE;
Wynik:
NOTICE: drop cascades to view vproducts Commands completed successfully
W tym przypadku kolumna została usunięta i otrzymałem komunikat wyjaśniający, że widok o nazwie vproducts
również został usunięty.
CASCADE
i RESTRICT
są obsługiwane w PostgreSQL, ale nie w SQL Server lub MySQL. Oba słowa kluczowe mogą być używane w MariaDB, ale nie mają żadnego efektu.
Oracle akceptuje CASCADE CONSTRAINTS
klauzula, która usuwa wszystkie ograniczenia klucza obcego, które odnoszą się do kluczy podstawowych i unikalnych zdefiniowanych w usuniętych kolumnach, a także wszystkie ograniczenia dotyczące wielu kolumn zdefiniowane w usuniętych kolumnach.
Upuść wiele kolumn
Niektóre RDBM umożliwiają upuszczenie wielu kolumn w jednej ALTER TABLE
oświadczenie. Składnia różni się w zależności od RDBMS.
W SQL Server możesz po prostu wymienić każdą kolumnę oddzieloną przecinkiem:
ALTER TABLE t1
DROP COLUMN c1, c2;
W innych systemach RDBMS (takich jak MySQL i PostgreSQL) będziesz musiał przepisać DROP COLUMN
dla każdej kolumny:
ALTER TABLE t1
DROP COLUMN c1, DROP COLUMN c2;
Zauważ, że ta składnia jest rozszerzeniem SQL i nie jest zgodna ze standardem SQL polegającym na posiadaniu tylko jednego DROP
klauzula na ALTER TABLE
oświadczenie.
Upuść ostatnią kolumnę
Niektóre RDBM umożliwiają usunięcie ostatniej kolumny w tabeli, pozostawiając pustą tabelę bez kolumn. Jest to rozszerzenie standardu SQL (który nie zezwala na tabele o zerowych kolumnach).
Na przykład w PostgreSQL użyłem następującej instrukcji, aby usunąć ostatnią pozostałą kolumnę w tabeli
ALTER TABLE t1
DROP COLUMN c3;
Wynik:
Commands completed successfully
Ale w SQL Server, jeśli zrobię to samo:
ALTER TABLE t1
DROP COLUMN c1, c2, c3;
Wynik:
Msg 4923, Level 16, State 1, Line 1 ALTER TABLE DROP COLUMN failed because 'c3' is the only data column in table 't1'. A table must have at least one data column.
Zauważ, że pomimo sformułowania tego komunikatu o błędzie, c3 nie było jedyną pozostałą kolumną. Właściwie były trzy kolumny. Jednak c3 byłoby ostatnim pozostałym, gdyby pozostałe dwa zostały odrzucone. W tym przypadku żadna z trzech kolumn nie została usunięta.
Tak czy inaczej, nawet gdybym porzucił pozostałe dwa, SQL Server odmówiłby porzucenia ostatniego.
MySQL odmawia również upuszczenia ostatniej kolumny w tabeli.
Jeśli chcesz usunąć tabelę, użyj DROP TABLE
.
Ograniczenia RDBMS
Chociaż podstawowa DROP COLUMN
składnia jest dość podobna w większości głównych RDBMS, każdy RDBMS ma zwykle własne ograniczenia dotyczące tego, kiedy kolumna zostanie usunięta lub nie.
Oto niektóre ograniczenia niektórych głównych systemów zarządzania bazą danych.
Serwer SQL
Nie można usunąć kolumny, gdy:
- Używane w indeksie, jako kolumna klucza lub jako
INCLUDE
- Używane w
CHECK
,FOREIGN KEY
,UNIQUE
lubPRIMARY KEY
ograniczenie. - Powiązany z wartością domyślną zdefiniowaną w
DEFAULT
słowo kluczowe lub powiązane z domyślnym obiektem. - Związany z regułą.
Źródło dla SQL Server:https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql
MySQL
Jeśli kolumny zostaną usunięte z tabeli, zostaną one również usunięte z dowolnego indeksu, którego są częścią. Jeśli wszystkie kolumny tworzące indeks zostaną usunięte, indeks również zostanie usunięty.
Źródło dla MySQL:https://dev.mysql.com/doc/refman/8.0/en/alter-table.html
PostgreSQL
Indeksy i ograniczenia tabeli dotyczące kolumny również zostaną automatycznie usunięte.
Statystyki wielowymiarowe odwołujące się do porzuconej kolumny zostaną również usunięte, jeśli usunięcie kolumny spowoduje, że statystyki będą zawierać dane tylko dla jednej kolumny.
Będziesz musiał użyć CASCADE
jeśli cokolwiek poza tabelą zależy od kolumny, na przykład klucze obce lub widoki.
Źródło dla PostgreSQL:https://www.postgresql.org/docs/current/sql-altertable.html
SQLite
SQLite nie obsługuje DROP COLUMN
składnia. Nie możesz upuścić kolumny w SQLite.
Jeśli chcesz usunąć kolumnę w SQLite, zaleca się wykonanie 12-etapowego procesu zalecanego w dokumentacji SQLite.
Źródło dla SQLite:https://sqlite.org/lang_altertable.html#otheralter
MariaDB
Jeśli kolumna jest częścią dowolnego indeksu, zostanie z nich usunięta, chyba że w tym samym czasie dodasz nową kolumnę o identycznej nazwie. Indeks zostanie usunięty, jeśli wszystkie kolumny z indeksu zostaną usunięte. Jeśli kolumna była używana w widoku lub regule, przy następnym dostępie do widoku lub reguły pojawi się błąd.
Z MariaDB 10.2.8, usuwanie kolumny, która jest częścią wielokolumnowego UNIQUE
ograniczenie jest niedozwolone.
MariaDB akceptuje RESTRICT
i CASCADE
aby ułatwić przenoszenie z innych systemów baz danych, ale w MariaDB nic nie robią.
MariaDB 10.4.0 obsługuje natychmiastową DROP COLUMN
. DROP COLUMN
zindeksowanej kolumny oznaczałoby DROP INDEX
(oraz w przypadku nie UNIQUE
indeks wielokolumnowy, ewentualnie ADD INDEX
). Nie będą one dozwolone w przypadku ALGORITHM=INSTANT
, ale inaczej niż wcześniej, mogą być dozwolone za pomocą ALGORITHM=NOCOPY
.
Źródło MariaDB:https://mariadb.com/kb/en/alter-table/#drop-column