DDL(Data Definition Language)定義資料庫結構。本文以完整可執行範例,涵蓋建庫/建表、查看結構、截斷表、主鍵/唯一/外鍵/Check 約束的增刪改,並對比 MySQL 與 Oracle 對 Check 約束的支援差異。
-- 建庫/刪庫/切庫
CREATE DATABASE IF NOT EXISTS mydb;
DROP DATABASE mydb;
USE mydb;
-- 建表
CREATE TABLE tb1 (
id INT,
name VARCHAR(255) DEFAULT 'anonymity',
info TEXT
);
-- 查看
SHOW TABLES;
DESC tb1; -- 或 SHOW COLUMNS FROM tb1
-- 截斷表(DDL,高效、不觸發 Trigger、重置 AUTO_INCREMENT)
TRUNCATE TABLE tb1;
-- 修改欄位加主鍵
ALTER TABLE tb1 MODIFY id INT PRIMARY KEY;
-- 修改欄位加唯一約束(允許多 NULL,因 NULL≠NULL)
ALTER TABLE tb1 MODIFY name VARCHAR(255) UNIQUE;
-- 建表同時定義主鍵+外鍵
CREATE TABLE tb2 (
id INT PRIMARY KEY AUTO_INCREMENT,
fid INT,
name VARCHAR(255) DEFAULT 'anonymity' NOT NULL,
info TEXT,
CONSTRAINT tb2_fk FOREIGN KEY (fid) REFERENCES tb1(id)
);
-- 刪除/新增外鍵
ALTER TABLE tb2 DROP FOREIGN KEY tb2_fk;
ALTER TABLE tb2 ADD FOREIGN KEY (fid) REFERENCES tb1(id);
| 資料庫 | 支援度 | 行為 |
|---|---|---|
| MySQL (≤ 8.0.15) | 語法通過、不生效 | ALTER TABLE tb1 ADD CHECK(id>5); 成功,但 INSERT VALUES(1) 仍可執行 |
| MySQL 8.0.16+ | 完整支援 | 真正強制檢查,違規報錯 |
| Oracle | 完整支援 | CREATE TABLE tb3 (id NUMBER(8), CHECK(id>100)); 違規拋 ORA-02290 |
SQL> CREATE TABLE tb3 (id NUMBER(8), name VARCHAR2(255), CHECK(id>100));
Table created.
SQL> INSERT INTO tb3 VALUES(6,'six');
ORA-02290: check constraint (SYS_C005457) violated
SQL> INSERT INTO tb3 VALUES(600,'six');
1 row created.
TRUNCATE 為 DDL,不可回滾、不觸發 ON DELETE Trigger、重置自增計數器;DELETE 為 DML,可回滾、觸發 Trigger。CONSTRAINT fk_xxx,便於後續管理。AUTO_INCREMENT 僅支援單欄主鍵,複合主鍵不可用。