W SQL ALTER TABLE
instrukcja modyfikuje definicję istniejącej tabeli.
Możesz użyć ALTER TABLE
zmieniać, dodawać lub usuwać kolumny i ograniczenia.
W zależności od systemu DBMS, ALTER TABLE
Instrukcja może być również używana do ponownego przypisywania i odbudowy partycji lub wyłączania i włączania ograniczeń i wyzwalaczy.
Składnia
ALTER TABLE
oświadczenie ogólnie wygląda tak:
ALTER TABLE table_name
[alter_option [, alter_option] ...]
[partition_options]
Gdzie:
table_name
to nazwa tabeli, którą chcesz zmienić.[alter_option [, alter_option] …]
to lista konkretnych zmian, które chcesz wprowadzić (na przykładADD
po której następuje nazwa i definicja kolumny lubDROP COLUMN
po której następuje nazwa kolumny itp.[partition_options]
to opcjonalna lista opcji przeznaczona specjalnie dla tabel partycjonowanych. Nie wszystkie DBMS obsługują tabele partycjonowane. Jeśli tak, takie opcje mogą umożliwić dodawanie, upuszczanie, odrzucanie, importowanie, scalanie lub dzielenie partycji lub przeprowadzanie konserwacji partycjonowania.
Pełna składnia ALTER TABLE
może być dość złożony i znacznie się różni w zależności od DBMS. W przypadku wszystkiego, co nie zostało omówione w tym artykule, zapoznaj się z dokumentacją DBMS.
Poniżej znajdują się przykłady najczęstszych ALTER TABLE
operacje.
Dodaj nową kolumnę
Aby dodać nową kolumnę do tabeli, użyj ADD
klauzula, po której następuje nazwa kolumny i typ danych.
ALTER TABLE Products
ADD ProductDescription varchar(500);
Spowoduje to dodanie nowej kolumny o nazwie ProductDescription
do Products
tabela.
W tym przykładzie utworzyliśmy kolumnę jako varchar(500)
ale użyjesz dowolnego typu danych, który jest odpowiedni dla Twojej nowej kolumny.
Możesz również uwzględnić ograniczenia w definicji kolumny, ale może to zależeć od Twojego DBMS i tego, czy tabela już zawiera dane (patrz omówienie tego poniżej).
Zmień nazwę kolumny
Większość głównych systemów zarządzania bazą danych (PostgreSQL, Oracle, SQLite, MySQL 8.0+, MariaDB 10.5.2+) umożliwia zmianę nazwy kolumny w następujący sposób:
ALTER TABLE table_name
RENAME COLUMN column_name TO new_column_name;
Jeśli używasz MySQL w wersji starszej niż 8.0 lub MariaDB starszej niż 10.5.2, musisz użyć CHANGE COLUMN
zamiast tego składnia, która wymaga również ponownego określenia typu danych. Tak:
ALTER TABLE table_name
CHANGE COLUMN old_column_name new_column_name datatype;
W SQL Server będziesz musiał użyć sp_rename
procedura składowana, aby zmienić nazwę kolumny. Tak:
EXEC sp_rename 'schema_name.table_name.column_name', 'new_column_name', 'COLUMN';
Upuść kolumnę
Aby upuścić kolumnę, użyj DROP COLUMN
klauzula, po której następuje nazwa kolumny.
ALTER TABLE table_name
DROP COLUMN column_name;
Zmień definicję kolumny
Składnia modyfikacji definicji istniejącej kolumny różni się znacznie w poszczególnych DBMS. Zależy to również od tego, jakie modyfikacje należy wprowadzić.
Aby wszystko było proste, zróbmy prostą modyfikację kolumny w SQL Server:
ALTER TABLE Products
ALTER COLUMN ProductDescription varchar(1000);
W tym przykładzie zmieniliśmy ProductDescription
kolumna z varchar(500)
do varchar(1000)
.
Poniżej przedstawiono podstawową składnię wymaganą przez każdy DBMS, aby dokonać takich samych lub podobnych zmian.
Serwer SQL:
ALTER TABLE table_name
ALTER COLUMN column_name datatype;
PostgreSQL:
ALTER TABLE table_name
ALTER COLUMN column_name TYPE datatype;
MySQL, MariaDB i Oracle przed 10g:
ALTER TABLE table_name
MODIFY COLUMN column_name datatype;
W Oracle 10g i nowszych:
ALTER TABLE table_name
MODIFY column_name datatype;
SQLite nie pozwoli ci zmienić kolumny poza zmianą jej nazwy.
Rzeczywista składnia każdego DBMS jest zwykle znacznie bardziej złożona i zależy dokładnie od tego, co próbujesz zrobić. Powinno to jednak rozpocząć od podstawowych modyfikacji kolumn.
Ograniczenia i uwagi
Generalnie należy unikać modyfikacji tabel, które zawierają dane. Wprowadzając zmiany, ryzykujesz utratę istniejących danych.
Powiedziawszy to, wiele DBMS faktycznie uniemożliwia wprowadzenie pewnych zmian, gdy tabela zawiera dane. Na przykład może się okazać, że nie możesz dodać NOT NULL
ograniczenie do kolumny zawierającej dane.
Niektóre DBMS mogą na to pozwolić, o ile używasz DEFAULT
ograniczenie (aby zapewnić wartość domyślną dla kolumn, do których nie wstawiono jawnie danych) lub kolumnę tożsamości/autoinkrementacji, kolumnę sygnatury czasowej itp.
Niektóre DBMS nie pozwalają na upuszczanie lub zmianę kolumn w tabeli.
Ponadto niektóre DBMS ograniczają typy danych, które można dodać.
Przykład – dodanie ograniczenia NOT NULL
Oto przykład, który pomoże zademonstrować powyższe punkty.
Oto, co się dzieje, gdy próbuję dodać kolumnę z NOT NULL
ograniczenie w SQL Server.
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL;
Wynik:
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.
Zasadniczo tabela zawiera już dane, więc SQL Server zwraca błąd, który mówi mi, że mogę dodać tylko NOT NULL
ograniczenie, jeśli tabela spełnia określone kryteria, a jeszcze ich nie spełnia.
I jest dobry powód dla tych kryteriów.
NOT NULL
ograniczenie zapewnia, że nie ma NULL
wartości w kolumnie w dowolnym wierszu. Problem polega na tym, że mamy już dane w tabeli i jeśli dodamy nową kolumnę, istniejące wiersze będą miały wartość NULL
– co natychmiast naruszy nasze NOT NULL
ograniczenie. Dlatego musimy określić dane, aby przejść do istniejących wierszy.
Aby to zrobić, możemy dodać DEFAULT
ograniczenie lub podobne, aby zapewnić, że wszystkie istniejące wiersze zostaną automatycznie wypełnione danymi w tej kolumnie.
Przykład:
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL DEFAULT 'N/A';
To po prostu dodaje DEFAULT
ograniczenie do słupa. To ograniczenie zapewnia, że wszystkie wiersze zawierają wartość (w tym przypadku wartość to N/A
), jeśli nie przypisano im wartości. Oznacza to, że nasz NOT NULL
ograniczenie nie zostanie naruszone, ponieważ wszystkie istniejące wiersze będą teraz zawierać wartość.
Jeśli nowa kolumna musi mieć unikalne, rosnące wartości, możesz zamiast tego ustawić ją jako IDENTITY
kolumna (lub AUTOINCREMENT
w SQLite i innych DBMS).
Jeśli jednak tabela nie zawiera jeszcze danych, możesz dodać kolumnę bez konieczności wykonywania żadnego z tych kroków.
Opcje partycji
Ten artykuł jest skierowany do początkujących, a podzielone na partycje tabele są nieco poza zakresem samouczka dla początkujących.
Powiedziawszy to, szybko omówię niektóre opcje partycjonowania w odniesieniu do ALTER TABLE
oświadczenie.
Jeśli system DBMS obsługuje tabele partycjonowane, prawdopodobnie zapewnia również opcje partycjonowania za pomocą ALTER TABLE
oświadczenie.
Na przykład w MySQL możesz wykonać następujące czynności:
ALTER TABLE Products
PARTITION BY HASH(ProductId)
PARTITIONS 8;
Dzieli tabelę na 8 partycji, za pomocą HASH
, używając ProductId
kolumna jako klucz partycjonowania.
PARTITION BY HASH
używa pozostałej części wyrażenia (w tym przypadku ProductId
kolumna) podzielona przez liczbę partycji (tj. moduł).
Możesz także użyć partycji zakresu. Oto jak możesz dodać partycję zakresu do istniejącej tabeli:
ALTER TABLE Products
ADD PARTITION (PARTITION Partition9 VALUES LESS THAN (2020));
Ten przykład sugeruje, że Products
tabela ma już 8 partycji zakresów i dodajemy kolejną partycję o nazwie Partition9
.
Możesz usunąć partycje w ten sposób:
ALTER TABLE Products
DROP PARTITION Partition8, Partition9;
Pamiętaj, że te przykłady dotyczą MySQL.
Napisałem również kilka artykułów dotyczących tabel partycjonowanych w SQL Server. W odniesieniu do ALTER TABLE
instrukcji, oto jak przełączyć partycję i oto jak przełączyć się na partycji (obie te czynności wykonuje się za pomocą ALTER TABLE
).
W SQL Server niektóre opcje partycji muszą być wykonane z innymi instrukcjami. Na przykład łączenie partycji odbywa się za pomocą ALTER PARTITION FUNCTION
instrukcja, a dzielenie partycji odbywa się za pomocą ALTER PARTITION SCHEME
oświadczenie.
Jeśli chcesz dowiedzieć się więcej o partycjonowanych tabelach w SQL Server, oto jak utworzyć partycjonowaną tabelę w SQL Server.
ALTER TABLE
w SQLite
Powinienem również wspomnieć, że SQLite ma bardzo ograniczoną obsługę ALTER TABLE
oświadczenie. W SQLite, ALTER TABLE
Instrukcja umożliwia zmianę nazwy tabeli, zmianę nazwy kolumny w tabeli lub dodanie nowej kolumny do istniejącej tabeli.
Wszelkie inne zmiany będą wymagały usunięcia tabeli i rozpoczęcia od nowa. Dotyczy to również dodawania kluczy obcych.