結構化查詢語言/修改表
ALTER TABLE 命令可以修改列定義和表約束,這些修改“動態”進行。這意味著現有的定義可以被擴充套件、改變或刪除,或者現有資料可以被強制轉換為不同的型別,或者現有資料可以根據新的定義進行評估。
-- change column definitions
ALTER TABLE <table_name> { ADD | ALTER } [ COLUMN ] <column_name> <column_definition>;
ALTER TABLE <table_name> { DROP } [ COLUMN ] <column_name>;
-- change table constraints
ALTER TABLE <table_name> { ADD | ALTER } CONSTRAINT <constraint_name> <constraint_definition>;
ALTER TABLE <table_name> { DROP } CONSTRAINT <constraint_name>;
以下示例基於測試表t1。
CREATE TABLE t1 (
id NUMERIC PRIMARY KEY,
col_1 CHAR(4)
);
ADD COLUMN 和 ALTER COLUMN 語句的語法與建立表頁面中顯示的類似。
可以使用 ADD COLUMN 語句為現有表新增額外的列。在此語句中,可以使用原始 Create Table 語句中的所有選項:資料型別、預設值、NOT NULL、主鍵、唯一鍵、外部索引鍵、檢查約束。
-- add a new column with any characteristic
ALTER TABLE t1 ADD COLUMN col_2 VARCHAR(100) CHECK (length(col_2) > 5); -- Oracle: The key word 'COLUMN' is not allowed.
使用 ALTER COLUMN 語句可以更改現有列的某些特性
- 資料型別
- 預設值
- 非空約束。
新的定義必須與舊的現有資料相容。例如,如果您將資料型別從 VARCHAR 更改為 NUMERIC,則此操作只有在可以將所有現有的 VARCHAR 資料強制轉換為 NUMERIC 時才會成功 - 將 'xyz' 強制轉換為 NUMERIC 會失敗。從 NUMERIC 到 VARCHAR 的強制轉換將成功,只要 VARCHAR 的寬度足以儲存結果即可。
提示:在更改列的特性時,一些實現會忽略 SQL 標準的語法,並使用其他關鍵字,如 'MODIFY'。
ALTER TABLE t1 ALTER COLUMN col_1 SET DATA TYPE NUMERIC;
ALTER TABLE t1 ALTER COLUMN col_1 SET DEFAULT 'n/a';
ALTER TABLE t1 ALTER COLUMN col_1 SET NOT NULL;
ALTER TABLE t1 ALTER COLUMN col_1 DROP NOT NULL;
可以從現有表中刪除列。
ALTER TABLE t1 DROP COLUMN col_2; -- Oracle: The key word 'COLUMN' is mandatory.
提示:作為對 SQL 標準的擴充套件,一些實現提供了 RENAME 或 SET INVISIBLE 命令。
可以新增、修改或刪除表約束。語法與建立表頁面中顯示的類似。
ALTER TABLE t1 ADD CONSTRAINT t1_col_1_unique UNIQUE (col_1);
ALTER TABLE t1 ALTER CONSTRAINT t1_col_1_unique UNIQUE (col_1);
提示:在更改表約束時,一些實現會忽略 SQL 標準的語法,並使用其他關鍵字,如 'MODIFY'。
ALTER TABLE t1 DROP CONSTRAINT t1_col_1_unique; -- MySQL: Not supported. Use 'DROP FOREIGN KEY' or 'DROP INDEX' instead.
提示:作為對 SQL 標準的擴充套件,一些實現提供了 ENABLE / DISABLE 命令用於約束。
在 't1' 表中新增一列 'col_3':numeric 型別,非空。
ALTER TABLE t1 ADD COLUMN col_3 NUMERIC NOT NULL;
從 't1' 表的 'col_3' 列新增一個外部索引鍵到 'person' 表的 'id' 列。
ALTER TABLE t1 ADD CONSTRAINT t1_col_3_fk FOREIGN KEY (col_3) REFERENCES person (id);