Database
 sql >> Datenbank >  >> RDS >> Database

SQL ALTER TABLE für Anfänger

In SQL die ALTER TABLE -Anweisung ändert die Definition einer vorhandenen Tabelle.

Sie können ALTER TABLE verwenden um Spalten und Beschränkungen zu ändern, hinzuzufügen oder zu löschen.

Abhängig von Ihrem DBMS ist die ALTER TABLE -Anweisung kann auch verwendet werden, um Partitionen neu zuzuweisen und neu zu erstellen oder Einschränkungen und Trigger zu deaktivieren und zu aktivieren.

Syntax

Die ALTER TABLE Anweisung geht im Allgemeinen so:

ALTER TABLE table_name
    [alter_option [, alter_option] ...]
    [partition_options]

Wo:

  • table_name ist der Name der Tabelle, die Sie ändern möchten.
  • [alter_option [, alter_option] …] ist eine Liste der spezifischen Änderungen, die Sie vornehmen möchten (zum Beispiel ADD gefolgt vom Spaltennamen und der Definition oder DROP COLUMN gefolgt vom Spaltennamen usw.).
  • [partition_options] ist eine optionale Liste von Optionen speziell für partitionierte Tabellen. Nicht alle DBMS unterstützen partitionierte Tabellen. Wenn dies bei Ihnen der Fall ist, können Sie mit diesen Optionen Partitionen hinzufügen, löschen, verwerfen, importieren, zusammenführen oder aufteilen oder die Partitionierung warten.

Die vollständige Syntax für ALTER TABLE kann ziemlich komplex sein und variiert erheblich zwischen DBMSs. Für alles, was nicht in diesem Artikel behandelt wird, konsultieren Sie Ihre DBMS-Dokumentation.

Nachfolgend finden Sie Beispiele für die gängigsten ALTER TABLE Operationen.

Neue Spalte hinzufügen

Um einer Tabelle eine neue Spalte hinzuzufügen, verwenden Sie den ADD -Klausel, gefolgt vom Spaltennamen und Datentyp.

ALTER TABLE Products 
ADD ProductDescription varchar(500);

Dadurch wird eine neue Spalte namens ProductDescription hinzugefügt zu den Products Tabelle.

In diesem Beispiel haben wir die Spalte zu einem varchar(500) gemacht Sie würden jedoch den für Ihre neue Spalte geeigneten Datentyp verwenden.

Sie können auch Einschränkungen in Ihre Spaltendefinition aufnehmen, dies hängt jedoch möglicherweise von Ihrem DBMS ab und davon, ob die Tabelle bereits Daten enthält oder nicht (siehe dazu die Diskussion weiter unten).

Spalte umbenennen

Bei den meisten großen RDBMS (PostgreSQL, Oracle, SQLite, MySQL 8.0+, MariaDB 10.5.2+) können Sie eine Spalte wie folgt umbenennen:

ALTER TABLE table_name 
RENAME COLUMN column_name TO new_column_name;

Wenn Sie MySQL vor Version 8.0 oder MariaDB vor 10.5.2 und höher verwenden, müssen Sie die CHANGE COLUMN verwenden Syntax stattdessen, was auch erfordert, dass Sie den Datentyp neu angeben. So:

ALTER TABLE table_name
CHANGE COLUMN old_column_name new_column_name datatype;

In SQL Server müssen Sie den sp_rename verwenden gespeicherte Prozedur zum Umbenennen einer Spalte. So:

EXEC sp_rename 'schema_name.table_name.column_name', 'new_column_name', 'COLUMN';

Eine Spalte löschen

Um eine Spalte zu löschen, verwenden Sie DROP COLUMN -Klausel, gefolgt vom Spaltennamen.

ALTER TABLE table_name 
DROP COLUMN column_name;

Ändern Sie die Definition einer Spalte

Die Syntax zum Ändern der Definition einer vorhandenen Spalte variiert erheblich zwischen DBMSs. Es hängt auch davon ab, welche Änderungen Sie vornehmen müssen.

Um die Dinge einfach zu halten, nehmen wir eine einfache Änderung an einer Spalte in SQL Server vor:

ALTER TABLE Products 
ALTER COLUMN ProductDescription varchar(1000);

In diesem Beispiel haben wir die ProductDescription geändert Spalte aus varchar(500) zu varchar(1000) .

Das Folgende zeigt die grundlegende Syntax, die von jedem DBMS benötigt wird, um dieselben oder ähnliche Änderungen vorzunehmen.

SQL-Server:

ALTER TABLE table_name 
ALTER COLUMN column_name datatype;

PostgreSQL:

ALTER TABLE table_name 
ALTER COLUMN column_name TYPE datatype;

MySQL, MariaDB und Oracle vor 10g:

ALTER TABLE table_name 
MODIFY COLUMN column_name datatype;

In Oracle 10g und höher:

ALTER TABLE table_name 
MODIFY column_name datatype;

SQLite erlaubt Ihnen nicht, eine Spalte zu ändern, außer sie umzubenennen.

Die tatsächliche Syntax für jedes DBMS ist normalerweise viel komplexer und hängt davon ab, was Sie genau tun möchten. Dies sollte Ihnen jedoch den Einstieg in grundlegende Spaltenänderungen erleichtern.

Einschränkungen und Erwägungen

Sie sollten im Allgemeinen keine Änderungen an Tabellen vornehmen, wenn diese Daten enthalten. Wenn Sie Änderungen vornehmen, laufen Sie Gefahr, vorhandene Daten zu verlieren.

Allerdings hindern viele DBMS Sie tatsächlich daran, bestimmte Änderungen vorzunehmen, sobald eine Tabelle Daten enthält. Beispielsweise stellen Sie möglicherweise fest, dass Sie NOT NULL nicht hinzufügen können Beschränkung auf eine Spalte, die Daten enthält.

Einige DBMS erlauben Ihnen dies, solange Sie einen DEFAULT verwenden Constraint (um einen Standardwert für Spalten bereitzustellen, in die keine Daten explizit eingefügt wurden), oder eine Identity/Autoincrement-Spalte oder eine Timestamp-Spalte usw.

Einige DBMSs erlauben es Ihnen nicht, Spalten in einer Tabelle zu löschen oder zu ändern.

Außerdem schränken einige DBMSs die Datentypen ein, die hinzugefügt werden können.

Beispiel – Hinzufügen einer NOT NULL-Einschränkung

Hier ist ein Beispiel, um die oben genannten Punkte zu demonstrieren.

Folgendes passiert, wenn ich versuche, eine Spalte mit NOT NULL hinzuzufügen Einschränkung in SQL Server.

ALTER TABLE Products 
ADD ProductDescription varchar(500) NOT NULL;

Ergebnis:

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.

Grundsätzlich enthält die Tabelle bereits Daten, und daher gibt SQL Server einen Fehler zurück, der mir mitteilt, dass ich nur NOT NULL hinzufügen kann Einschränkung, wenn die Tabelle bestimmte Kriterien erfüllt und diese Kriterien noch nicht erfüllt.

Und es gibt einen guten Grund für dieses Kriterium.

Ein NOT NULL Einschränkung stellt sicher, dass es keine NULL gibt Werte in der Spalte in einer beliebigen Zeile. Das Problem ist, dass wir bereits Daten in der Tabelle haben und wenn wir eine neue Spalte hinzufügen, werden diese vorhandenen Zeilen NULL sein – was sofort gegen unseren NOT NULL verstößt Zwang. Also müssen wir Daten angeben, die in die bestehenden Zeilen gehen sollen.

Dazu können wir einen DEFAULT hinzufügen Einschränkung oder ähnliches, um sicherzustellen, dass alle vorhandenen Zeilen automatisch mit Daten in dieser Spalte gefüllt werden.

Beispiel:

ALTER TABLE Products 
ADD ProductDescription varchar(500) NOT NULL DEFAULT 'N/A';

Dies fügt einfach einen DEFAULT hinzu Beschränkung auf die Spalte. Diese Einschränkung stellt sicher, dass alle Zeilen einen Wert enthalten (in diesem Fall ist der Wert N/A ), wenn ihnen kein Wert zugewiesen wurde. Das bedeutet unser NOT NULL Einschränkung wird nicht verletzt, da alle vorhandenen Zeilen jetzt einen Wert enthalten.

Wenn die neue Spalte eindeutige, inkrementierende Werte haben muss, können Sie sie stattdessen zu einer IDENTITY machen Spalte (oder AUTOINCREMENT in SQLite und anderen DBMS).

Wenn die Tabelle jedoch noch keine Daten enthält, können Sie die Spalte möglicherweise hinzufügen, ohne einen dieser Schritte ausführen zu müssen.

Partitionsoptionen

Dieser Artikel richtet sich an Anfänger, und partitionierte Tabellen liegen etwas außerhalb des Bereichs eines Anfänger-Tutorials.

Trotzdem werde ich schnell einige der Partitionierungsoptionen in Bezug auf ALTER TABLE durchgehen Erklärung.

Wenn Ihr DBMS partitionierte Tabellen unterstützt, bietet es wahrscheinlich auch Partitionsoptionen mit ALTER TABLE Erklärung.

In MySQL könnten Sie beispielsweise Folgendes tun:

ALTER TABLE Products
PARTITION BY HASH(ProductId)
PARTITIONS 8;

Dies partitioniert die Tabelle in 8 Partitionen, durch HASH , unter Verwendung der ProductId Spalte als Partitionierungsschlüssel.

PARTITION BY HASH verwendet den Rest des Ausdrucks (in diesem Fall die ProductId Spalte) dividiert durch die Anzahl der Partitionen (d. h. den Modulus).

Sie können auch Bereichspartitionen verwenden. So können Sie einer vorhandenen Tabelle eine Bereichspartition hinzufügen:

ALTER TABLE Products 
ADD PARTITION (PARTITION Partition9 VALUES LESS THAN (2020));

Dieses Beispiel impliziert, dass die Products Die Tabelle hat bereits 8 Bereichspartitionen, und wir fügen eine weitere Partition mit dem Namen Partition9 hinzu .

Sie können Partitionen wie folgt löschen:

ALTER TABLE Products 
DROP PARTITION Partition8, Partition9;

Denken Sie daran, dass diese Beispiele für MySQL gelten.

Ich habe auch einige Artikel zu partitionierten Tabellen in SQL Server geschrieben. In Bezug auf ALTER TABLE -Anweisung, hier erfahren Sie, wie Sie eine Partition ausschalten und wie Sie eine Partition einwechseln (beide werden mit ALTER TABLE erledigt ).

In SQL Server müssen einige Partitionsoptionen mit anderen Anweisungen ausgeführt werden. Zum Beispiel wird das Zusammenführen von Partitionen mit der ALTER PARTITION FUNCTION durchgeführt -Anweisung, und das Aufteilen von Partitionen erfolgt mit dem ALTER PARTITION SCHEME Erklärung.

Wenn Sie mehr über partitionierte Tabellen in SQL Server erfahren möchten, erfahren Sie hier, wie Sie eine partitionierte Tabelle in SQL Server erstellen.

ALTER TABLE in SQLite

Ich sollte auch erwähnen, dass SQLite ALTER TABLE nur sehr eingeschränkt unterstützt Erklärung. In SQLite die ALTER TABLE -Anweisung können Sie eine Tabelle umbenennen, eine Spalte innerhalb einer Tabelle umbenennen oder einer vorhandenen Tabelle eine neue Spalte hinzufügen.

Alle anderen Änderungen erfordern, dass Sie die Tabelle löschen und neu beginnen. Dies gilt auch für das Hinzufügen von Fremdschlüsseln.