SQL

DDL

SQL

CREATE、ALTER、DROP

CREATE TABLE

テーブル作成とデータ型

ddl.sql sql
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-index.sql sql
-- テーブルの変更
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; -- 依存する外部キーも削除