Database
 sql >> Baza danych >  >> RDS >> Database

SQL DROP COLUMN dla początkujących

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 lub PRIMARY 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konfigurowanie Service Broker do przetwarzania asynchronicznego

  2. Klucz podstawowy SQL

  3. ScaleGrid uruchamia obsługę Google Cloud Platform (GCP) dla hostingu zarządzanej bazy danych

  4. Nowe rodziny procesorów AMD dobrze porównują się z nowymi procesorami Intel

  5. Jak ograniczyć wyniki w T-SQL