DDL
SQL
CREATE、ALTER、DROP
CREATE TABLE
テーブル作成とデータ型
CREATE TABLE users (
id SERIAL PRIMARY KEY, -- 自動採番(PostgreSQL)
-- または: id INT AUTO_INCREMENT PRIMARY KEY -- MySQL
uuid UUID DEFAULT gen_random_uuid(),
name VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
age INT CHECK (age >= 0 AND age <= 150),
role VARCHAR(20) NOT NULL DEFAULT 'user',
bio TEXT, -- NULL許容
score DECIMAL(5,2), -- 合計5桁、小数2桁
is_active BOOLEAN NOT NULL DEFAULT true,
metadata JSONB, -- JSON型(PostgreSQL)
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
deleted_at TIMESTAMP, -- Soft delete用
-- 複合ユニーク制約
CONSTRAINT uq_name_email UNIQUE (name, email)
);
-- 外部キー
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
total DECIMAL(10,2) NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);ALTER TABLE とインデックス
テーブル変更とパフォーマンスチューニング
-- テーブルの変更
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
ALTER TABLE users DROP COLUMN phone;
ALTER TABLE users RENAME COLUMN bio TO biography;
ALTER TABLE users ALTER COLUMN age TYPE BIGINT;
ALTER TABLE users ALTER COLUMN role SET NOT NULL;
ALTER TABLE users ALTER COLUMN role DROP NOT NULL;
ALTER TABLE users ALTER COLUMN role SET DEFAULT 'user';
-- テーブル名変更
ALTER TABLE users RENAME TO accounts;
-- インデックス
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_country ON users(country);
CREATE UNIQUE INDEX idx_users_email_unique ON users(email);
-- 複合インデックス(順序が重要)
CREATE INDEX idx_orders_user_date ON orders(user_id, created_at DESC);
-- 部分インデックス(条件付き)
CREATE INDEX idx_active_users ON users(email) WHERE is_active = true;
-- インデックス削除
DROP INDEX idx_users_email;
ALTER TABLE users DROP CONSTRAINT uq_name_email;
-- テーブル削除
DROP TABLE IF EXISTS temp_users;
DROP TABLE orders CASCADE; -- 依存する外部キーも削除