ALTER TABLE tbl_name [alter_specification, ...]
alter_specification:
ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name]
| ADD [CONSTRAINT symbol] PRIMARY KEY [index_type] (col_name, ...)
| ADD [CONSTRAINT symbol] UNIQUE [INDEX|KEY] [index_name] (col_name, ...)
| ADD [CONSTRAINT symbol] INDEX [index_name] (col_name, ...)
| ADD [CONSTRAINT symbol] FOREIGN KEY [index_name] (col_name, ...) reference_definition
| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
| CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFTER col_name]
| MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
| DROP [COLUMN] col_name
| DROP PRIMARY KEY
| DROP INDEX index_name
| DROP FOREIGN KEY fk_symbol
| RENAME [TO|AS] new_tbl_name
| ...
-- 末尾新增
ALTER TABLE student ADD name VARCHAR(20);
-- 指定位置新增
ALTER TABLE student ADD age INT NOT NULL DEFAULT 18 AFTER name;
ALTER TABLE student ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
-- 修改類型、默認值、註釋(字段名不變用 MODIFY)
ALTER TABLE student MODIFY name VARCHAR(50) NOT NULL DEFAULT 'liming' COMMENT '學生姓名';
-- 修改字段名(必須用 CHANGE,即使類型不變也要重複聲明類型)
ALTER TABLE student CHANGE name student_name VARCHAR(50) NOT NULL DEFAULT 'liming' COMMENT '學生姓名';
ALTER TABLE student DROP COLUMN name;
-- 單列
ALTER TABLE student ADD INDEX idx_name (name);
-- 組合索引(最左前綴原則)
ALTER TABLE student ADD INDEX idx_class_age (class_id, age);
ALTER TABLE student ADD UNIQUE INDEX uk_card (card_number);
-- 或
ALTER TABLE student ADD CONSTRAINT uk_card UNIQUE (card_number);
ALTER TABLE student DROP INDEX idx_name;
-- 主鍵刪除單獨語法
ALTER TABLE student DROP PRIMARY KEY;
SHOW INDEX FROM student;
-- 或
SHOW KEYS FROM student\G
-- 非自增主鍵
ALTER TABLE student ADD PRIMARY KEY (id);
-- 自增主鍵(需先確保列為 NOT NULL)
ALTER TABLE student MODIFY id INT NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (id);
-- 非自增主鍵
ALTER TABLE student DROP PRIMARY KEY;
-- 自增主鍵(必須先去掉 AUTO_INCREMENT)
ALTER TABLE student MODIFY id INT, DROP PRIMARY KEY;
ALTER TABLE old_name RENAME TO new_name;
-- 或
RENAME TABLE old_name TO new_name;
ALTER TABLE student ENGINE = InnoDB;
ALTER TABLE student CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
ALTER TABLE student COMMENT = '學生信息表';
-- 添加
ALTER TABLE grade ADD CONSTRAINT fk_grade_class FOREIGN KEY (class_id) REFERENCES class(id);
-- 刪除
ALTER TABLE grade DROP FOREIGN KEY fk_grade_class;
ALTER TABLE grade ADD CONSTRAINT chk_sex CHECK (sex IN ('男','女'));
ALTER TABLE grade DROP CONSTRAINT chk_sex;
ALTER TABLE grade ALTER COLUMN bak SET DEFAULT '我是學生';
ALTER TABLE grade ALTER COLUMN bak DROP DEFAULT;
<?php
$link = mysqli_connect($host, $user, $pass, $db);
if (!$link) die('Connect failed: ' . mysqli_connect_error());
$sql = "ALTER TABLE `article` ADD `keywords` VARCHAR(100) NOT NULL DEFAULT ''";
if (mysqli_query($link, $sql)) {
echo "Add succeed";
} else {
echo "Error: " . mysqli_error($link);
}
mysqli_close($link);
?>
ADD COLUMN、DROP INDEX 等多操作支持 ALGORITHM=INSTANT,無鎖、無拷貝LOCK=NONE 或 LOCK=SHARED 控制鎖級別ALTER TABLE 是 MySQL 結構變更的瑞士軍刀。掌握 ADD/MODIFY/CHANGE/DROP 字段、**索引/主鍵/外鍵/約束** 管理、**RENAME/ENGINE/CHARSET** 表級操作,並結合 Instant DDL / pt-osc / 低峰執行 / 備份先行 生產級策略,可安全高效完成從開發測試到核心業務上線的各類結構變更。