MySQLデータ操作と制約、トランザクションの核心技術

条件を付ける目的は、デカルト積による無駄な組み合わせを避けるためであり、マッチング回数自体は変わらない。

複数レコードの一括挿入

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;

分離レベルの階層

  1. READ UNCOMMITTED:未コミットデータ読取(ダーティリード発生)
  2. READ COMMITTED:コミット済みのみ読取(Oracleデフォルト)
  3. REPEATABLE READ:トランザクション開始時点のスナップショット(MySQLデフォルト)
  4. SERIALIZABLE:完全直列化(最高安全性・最低性能)
SELECT @@transaction_isolation;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

タグ: MySQL トランザクション ストレージエンジン SQL制約 データベース設計

9月1日 01:33 投稿