跨資料庫開發/遷移時,DDL 語法差異是常見痛點。本文整理三大主流資料庫在**索引、外鍵、欄位增刪改**上的標準語法對照,方便快速查閱。
| 操作 | MySQL | SQL Server | Oracle |
|---|---|---|---|
| 建立一般索引 | CREATE INDEX idx_name ON tbl(col); | CREATE INDEX idx_name ON tbl(col); | CREATE INDEX idx_name ON tbl(col); |
| 建立唯一索引 | CREATE UNIQUE INDEX idx_name ON tbl(col); | CREATE UNIQUE INDEX idx_name ON tbl(col); | CREATE UNIQUE INDEX idx_name ON tbl(col); |
| 透過 ALTER TABLE 加索引 | ALTER TABLE tbl ADD INDEX idx_name(col); | CREATE INDEX idx_name ON tbl(col); (不支援 ALTER 加索引) | CREATE INDEX idx_name ON tbl(col); |
| 刪除索引 | DROP INDEX idx_name ON tbl;ALTER TABLE tbl DROP INDEX idx_name; | DROP INDEX idx_name ON tbl; | DROP INDEX idx_name; |
| 主鍵索引 | ALTER TABLE tbl ADD PRIMARY KEY(col); | ALTER TABLE tbl ADD CONSTRAINT pk_name PRIMARY KEY(col); | ALTER TABLE tbl ADD CONSTRAINT pk_name PRIMARY KEY(col); |
| 操作 | MySQL | SQL Server | Oracle |
|---|---|---|---|
| 加外鍵 | ALTER TABLE child ADD CONSTRAINT fk_name FOREIGN KEY (pid) REFERENCES parent(id); | ALTER TABLE child ADD CONSTRAINT fk_name FOREIGN KEY (pid) REFERENCES parent(id); | ALTER TABLE child ADD CONSTRAINT fk_name FOREIGN KEY (pid) REFERENCES parent(id); |
| 刪除外鍵 | ALTER TABLE child DROP FOREIGN KEY fk_name; | ALTER TABLE child DROP CONSTRAINT fk_name; | ALTER TABLE child DROP CONSTRAINT fk_name; |
| 注意事項 | 父/子欄位**資料型別、長度、字元集、校對規則必須完全一致**;InnoDB 才支援外鍵 | 需參考表有唯一索引/主鍵 | 需參考表有唯一/主鍵索引;支援 ON DELETE CASCADE/SET NULL |
| 操作 | MySQL | SQL Server | Oracle |
|---|---|---|---|
| 新增欄位 | ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT ''; | ALTER TABLE tbl ADD col VARCHAR(20) NOT NULL DEFAULT ''; | ALTER TABLE tbl ADD (col VARCHAR2(20) DEFAULT '' NOT NULL); |
| 修改欄位型別/屬性 | ALTER TABLE tbl MODIFY col VARCHAR(50) NOT NULL; | ALTER TABLE tbl ALTER COLUMN col VARCHAR(50) NOT NULL; | ALTER TABLE tbl MODIFY (col VARCHAR2(50) NOT NULL); |
| 刪除欄位 | ALTER TABLE tbl DROP COLUMN col; | ALTER TABLE tbl DROP COLUMN col; | ALTER TABLE tbl DROP COLUMN col; |
| 重命名欄位 | ALTER TABLE tbl CHANGE old_col new_col VARCHAR(50) NOT NULL; | EXEC sp_rename 'tbl.old_col', 'new_col', 'COLUMN'; | ALTER TABLE tbl RENAME COLUMN old_col TO new_col; (12c+) |
-- MySQL DESC tbl; SHOW CREATE TABLE tbl; -- SQL Server EXEC sp_help 'tbl'; SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='tbl'; -- Oracle DESC tbl; SELECT * FROM USER_TAB_COLUMNS WHERE TABLE_NAME='TBL';