資料庫與資料表查看
SHOW DATABASES;
USE database_name;
SHOW TABLES;
SHOW TABLES LIKE 'prefix_%';
DESCRIBE table_name;
-- 或
SHOW COLUMNS FROM table_name;
SHOW CREATE TABLE table_name;
資料表結構修改 (ALTER TABLE)
-- 重命名資料表
ALTER TABLE old_name RENAME TO new_name;
-- 新增欄位
ALTER TABLE table_name ADD COLUMN col_name VARCHAR(100) NOT NULL DEFAULT '' AFTER existing_col;
-- 刪除欄位
ALTER TABLE table_name DROP COLUMN col_name;
-- 修改欄位定義(型別、預設值、註解)
ALTER TABLE table_name MODIFY COLUMN col_name VARCHAR(200) NOT NULL DEFAULT '' COMMENT '說明';
ALTER TABLE table_name CHANGE COLUMN old_name new_name VARCHAR(200) NOT NULL;
-- 索引管理
ALTER TABLE table_name ADD INDEX idx_name (col1, col2);
ALTER TABLE table_name ADD UNIQUE INDEX uniq_name (col_name);
ALTER TABLE table_name ADD PRIMARY KEY (id);
ALTER TABLE table_name DROP INDEX idx_name;
ALTER TABLE table_name DROP PRIMARY KEY;
資料操作 (DML)
-- 插入單筆
INSERT INTO table_name (col1, col2) VALUES ('val1', 'val2');
-- 插入多筆(批次,效能佳)
INSERT INTO table_name (col1, col2) VALUES
('a', 1), ('b', 2), ('c', 3);
-- 插入或更新(ON DUPLICATE KEY UPDATE)
INSERT INTO table_name (id, col1, col2) VALUES (1, 'new', 'val')
ON DUPLICATE KEY UPDATE col1=VALUES(col1), col2=VALUES(col2);
-- 更新
UPDATE table_name SET col1 = 'new_val' WHERE col2 = 'condition';
-- 刪除
DELETE FROM table_name WHERE id = 1;
TRUNCATE TABLE table_name; -- 快速清空表,重置 AUTO_INCREMENT
資料表與資料庫刪除
DROP TABLE IF EXISTS table_name;
DROP DATABASE IF EXISTS database_name;
PHP 中執行 DDL/DML 的最佳實踐
<?php
$pdo = new PDO($dsn, $user, $pass, $options);
// DDL:使用 exec()(無結果集)
$pdo->exec("CREATE TABLE ...");
// DML 單筆:使用 prepare + execute
$stmt = $pdo->prepare("INSERT INTO users (email, name) VALUES (?, ?)");
$stmt->execute(['user@example.com', 'John']);
// DML 批次:使用交易 + 預處理
$pdo->beginTransaction();
try {
$stmt = $pdo->prepare("INSERT INTO logs (msg) VALUES (?)");
foreach ($messages as $msg) {
$stmt->execute([$msg]);
}
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
throw $e;
}
// 取得最後插入 ID
$lastId = $pdo->lastInsertId();
// 影響行數
$affected = $stmt->rowCount();
?>
避坑指南
- 不區分大小寫:SQL 關鍵字不分大小寫,但資料庫/資料表名稱在 Linux 下區分大小寫(取決於
lower_case_table_names 設定)
- 反引號保護識別符:
\`order\`、\`group\` 避免保留字衝突
- 外鍵約束需 InnoDB:MyISAM 不支援外鍵
- 大量資料操作用交易:確保原子性、提升效能
- 避免 SELECT *:明確列出欄位,減少網路傳輸與耦合