SQLでテーブルを作成する際に使用するCREATE TABLE文は、データベース設計の基礎となる重要な命令です。基本的な構文は以下のようになります:
CREATE TABLE テーブル名 (
列名1 データ型1 [制約],
列名2 データ型2 [制約],
...
[テーブル制約]
)
ここで、各要素について詳しく見ていきましょう:
以下は、簡単な例として「従業員」テーブルを作成するSQL文です:
CREATE TABLE 従業員 (
従業員ID INT PRIMARY KEY,
氏名 VARCHAR(50) NOT NULL,
入社日 DATE,
部署 VARCHAR(30),
給与 DECIMAL(10, 2)
)
この例では、従業員IDを主キーとし、氏名を必須項目としています。入社日、部署、給与もそれぞれ適切なデータ型で定義されています。
テーブル作成時に適切なデータ型を選択することは、データベースの性能と整合性を確保する上で非常に重要です。以下に、主要なデータ型とその選択ポイントを紹介します:
データ型の選択は、以下の点を考慮して行います:
例えば、郵便番号のような固定長の文字列はCHAR型を、名前のような可変長の文字列はVARCHAR型を使用するのが適切です。
CREATE TABLE 顧客 (
顧客ID INT PRIMARY KEY,
氏名 VARCHAR(50) NOT NULL,
郵便番号 CHAR(7),
生年月日 DATE,
登録日時 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
この例では、顧客IDに整数型、氏名に可変長文字列型、郵便番号に固定長文字列型、生年月日に日付型、登録日時にタイムスタンプ型を使用しています。
適切なデータ型の選択は、データベースの性能、整合性、拡張性に大きな影響を与えます。プロジェクトの要件をよく理解し、将来の拡張性も考慮して慎重に選択することが重要です。
テーブル作成時に適切な制約と索引を設定することは、データの整合性を保ち、クエリのパフォーマンスを向上させる上で非常に重要です。以下に、主要な制約と索引、およびその効果的な使用方法を紹介します:
CREATE TABLE 商品 (
商品ID INT PRIMARY KEY,
商品名 VARCHAR(100) NOT NULL
)
CREATE TABLE 注文 (
注文ID INT PRIMARY KEY,
顧客ID INT,
注文日 DATE,
FOREIGN KEY (顧客ID) REFERENCES 顧客(顧客ID)
)
CREATE TABLE 従業員 (
従業員ID INT PRIMARY KEY,
メールアドレス VARCHAR(100) UNIQUE
)
CREATE TABLE 顧客 (
顧客ID INT PRIMARY KEY,
氏名 VARCHAR(50) NOT NULL,
電話番号 VARCHAR(20) NOT NULL
)
CREATE TABLE 製品 (
製品ID INT PRIMARY KEY,
製品名 VARCHAR(100) NOT NULL,
価格 DECIMAL(10, 2) CHECK (価格 > 0)
)
CREATE TABLE 注文 (
注文ID INT PRIMARY KEY,
注文日時 TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
状態 VARCHAR(20) DEFAULT '処理中'
)
CREATE TABLE 商品 (
商品ID INT PRIMARY KEY,
商品名 VARCHAR(100) NOT NULL,
カテゴリ VARCHAR(50)
)
CREATE INDEX idx_商品_カテゴリ ON 商品(カテゴリ)
これらの制約と索引を効果的に使用することで、以下のメリットが得られます:
ただし、過度の制約や索引の使用は、挿入や更新のパフォーマンスに影響を与える可能性があるため、適切なバランスを取ることが重要です。プロジェクトの要件や予想されるクエリパターンを十分に分析し、最適な制約と索引の組み合わせを選択することをお勧めします。
大規模なデータベースを扱う際、テーブルパーティショニングは非常に強力な最適化テクニックです。パーティショニングを活用することで、大量のデータを効率的に管理し、クエリのパフォーマンスを向上させることができます。ここでは、SQLテーブル作成時のパーティショニングの活用方法と注意点について詳しく解説します。
パーティショニングとは、大きなテーブルを論理的または物理的に小さな部分(パーティション)に分割する技術です。主な利点は以下の通りです:
パーティショニングの主な方法:
以下は、MySQL 8.0以降で日付範囲によるパーティショニングを使用したテーブル作成の例です:
CREATE TABLE 売上 (
売上ID INT NOT NULL,
商品ID INT NOT NULL,
売上日 DATE NOT NULL,
金額 DECIMAL(10, 2) NOT NULL,
PRIMARY KEY (売上ID, 売上日)
)
PARTITION BY RANGE (YEAR(売上日)) (
PARTITION p0 VALUES LESS THAN (2020),
PARTITION p1 VALUES LESS THAN (2021),
PARTITION p2 VALUES LESS THAN (2022),
PARTITION p3 VALUES LESS THAN (2023),
PARTITION p4 VALUES LESS THAN MAXVALUE
)
この例では、売上テーブルを年ごとにパーティショニングしています。2020年未満、2020年、2021年、2022年、2023年以降のデータがそれぞれ異なるパーティションに格納されます。
パーティショニングを活用する際の注意点: