跳轉到內容

結構化查詢語言/修改表

來自華夏公益教科書,自由的教科書



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);


華夏公益教科書