条件を付ける目的は、デカルト積による無駄な組み合わせを避けるためであり、マッチング回数自体は変わらない。
複数レコードの一括挿入
INSERT INTO user_profile (user_id, full_name, dob, reg_date) VALUES
(101, '田中太郎', '1990-05-20', NOW()),
(102, '山本花子', '1988-12-03', NOW()),
(103, '佐藤健', '1995-07-14', NOW());
構文:INSERT INTO テーブル名 (列1, 列2) VALUES (...), (...), (...);
テーブルの高速コピー
CREATE TABLE employee_backup AS SELECT * FROM employees;
この方法では、SELECT結果をそのまま新規テーブルとして作成。構造とデータが同時にコピーされる。
CREATE TABLE manager_list AS
SELECT emp_id, emp_name FROM employees WHERE position = 'manager';
既存テーブルへのクエリ結果挿入
CREATE TABLE department_copy AS SELECT * FROM departments;
INSERT INTO department_copy SELECT * FROM departments;
データ削除の効率比較
DELETE FROM department_copy; -- 遅いがロールバック可能
TRUNCATE TABLE department_copy; -- 高速だが不可逆(DDL)
DROP TABLE department_copy; -- テーブル構造ごと削除
大規模データ削除時はTRUNCATE推奨。ただし事前確認必須。
テーブル構造変更
ALTER文を使用(DDL)。実務では設計確定後の構造変更は稀。Javaコードとの整合性コストが高いため、ツール利用が主流。
制約の種類と適用
- NOT NULL:空値禁止
- UNIQUE:重複禁止(NULL可)
- PRIMARY KEY:主キー(NOT NULL + UNIQUE)
- FOREIGN KEY:外部キー参照
- CHECK:条件制限(MySQL非対応)
CREATE TABLE members (
member_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100),
UNIQUE KEY uk_email_username (email, username)
);
複合ユニーク制約は表レベルで定義。自然主キー(連番など)が推奨される。
外部キー制約の実装
CREATE TABLE classes (
class_code INT PRIMARY KEY,
class_name VARCHAR(100)
);
CREATE TABLE students (
student_id INT PRIMARY KEY AUTO_INCREMENT,
student_name VARCHAR(50),
class_ref INT,
FOREIGN KEY (class_ref) REFERENCES classes(class_code)
);
親テーブル→子テーブルの順で作成。削除時は逆順。外部キー値はNULL許容。
ストレージエンジン選択
SHOW ENGINES\G
CREATE TABLE products (...) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
主要エンジン特性:
- InnoDB:トランザクション対応・行ロック・外キー(デフォルト)
- MyISAM:高速読み取り・全文検索・クラッシュ復旧非対応
- MEMORY:メモリ上展開・超高速・再起動時消失
トランザクション管理
ACID特性:
- Atomicity(原子性):全操作の成功/失敗が一体
- Consistency(一貫性):データ整合性維持
- Isolation(独立性):並行処理時の干渉防止
- Durability(永続性):コミット後は確実に保存
START TRANSACTION;
INSERT INTO accounts VALUES (1, 'A口座', 10000);
UPDATE accounts SET balance = balance - 5000 WHERE id = 1;
UPDATE accounts SET balance = balance + 5000 WHERE id = 2;
COMMIT; -- または ROLLBACK;
分離レベルの階層
- READ UNCOMMITTED:未コミットデータ読取(ダーティリード発生)
- READ COMMITTED:コミット済みのみ読取(Oracleデフォルト)
- REPEATABLE READ:トランザクション開始時点のスナップショット(MySQLデフォルト)
- SERIALIZABLE:完全直列化(最高安全性・最低性能)
SELECT @@transaction_isolation;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;