ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
CREATE TABLE とは
SQL で新しい表(テーブル)を作成するには CREATE TABLE 文を使います。列の名前、データ型、制約をまとめて指定し、データ格納の枠組みを定義します。
基本構文
CREATE TABLE 表名 (
列名1 データ型1 [列制約],
列名2 データ型2 [列制約],
...
[表制約 (主キー / 外部キー / CHECK / UNIQUE)]
);
基本例
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE,
hire_date DATE DEFAULT CURRENT_DATE,
salary DECIMAL(10,2) CHECK (salary >= 0),
dept_id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
主なデータ型
DBMS により名称が一部異なりますが、代表的な型は以下です。
| 用途 | 代表的な型 | 備考 |
|---|---|---|
| 整数 | INT / BIGINT / SMALLINT | サイズで使い分け |
| 小数 | DECIMAL(p,s) / NUMERIC | 金額など正確に扱いたい値 |
| 浮動小数 | FLOAT / DOUBLE / REAL | 科学計算など |
| 文字列(固定長) | CHAR(n) | 常に n 文字で格納 |
| 文字列(可変長) | VARCHAR(n) | 最大 n 文字 |
| 長文 | TEXT / CLOB | 長文用 |
| 日付 | DATE / TIME / TIMESTAMP / DATETIME | DBMS で差あり |
| 真偽 | BOOLEAN / BIT | Oracle は NUMBER(1) 代用 |
| バイナリ | BLOB / VARBINARY | 画像・ファイル等 |
列制約
| 制約 | 意味 |
|---|---|
NOT NULL | NULL を許さない |
UNIQUE | 列内で値が一意 |
PRIMARY KEY | 主キー(NOT NULL + UNIQUE) |
DEFAULT 値 | INSERT 時に省略された場合の既定値 |
CHECK (条件) | 挿入 / 更新時に条件を満たす値のみ許可 |
REFERENCES 親表(列) | 外部キー参照 |
表制約(複数列にまたがる制約)
列単位の制約とは別に、テーブル末尾にまとめて書く表制約があります。複合主キーや複数列の外部キーで使います。
CREATE TABLE order_items (
order_id INT NOT NULL,
item_no INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
-- 表制約
PRIMARY KEY (order_id, item_no),
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (product_id) REFERENCES products(product_id),
CONSTRAINT chk_qty CHECK (quantity > 0)
);
主キーの書き方 2 通り
-- 列制約として
CREATE TABLE t1 (
id INT PRIMARY KEY,
name VARCHAR(50)
);
-- 表制約として(複合主キー時もこちら)
CREATE TABLE t2 (
id INT,
sub INT,
name VARCHAR(50),
PRIMARY KEY (id, sub)
);
外部キー(FOREIGN KEY)
親テーブルに存在する値しか入れさせない制約です。ON DELETE / ON UPDATE で連鎖動作を指定できます。
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT NOT NULL,
FOREIGN KEY (customer_id)
REFERENCES customers(customer_id)
ON DELETE CASCADE -- 親が消えたら子も消す
ON UPDATE CASCADE -- 親のキーが変わったら子も追随
);
| 動作 | 意味 |
|---|---|
CASCADE | 連動して削除 / 更新 |
SET NULL | 子側を NULL にする(NOT NULL 列は不可) |
SET DEFAULT | 子側を DEFAULT 値に |
RESTRICT / NO ACTION | 子が居る間は親の削除 / 更新を拒否 |
自動採番(IDENTITY / SERIAL / AUTO_INCREMENT)
主キーを自動採番にしたい場合、DBMS ごとに書き方が異なります。
| DBMS | 書き方 |
|---|---|
| MySQL | id INT NOT NULL AUTO_INCREMENT PRIMARY KEY |
| PostgreSQL | id SERIAL PRIMARY KEY または id INT GENERATED ALWAYS AS IDENTITY |
| SQL Server | id INT IDENTITY(1,1) PRIMARY KEY |
| Oracle | id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY |
| SQLite | id INTEGER PRIMARY KEY AUTOINCREMENT |
IF NOT EXISTS(既存ならスキップ)
マイグレーション初回実行の冪等性を保ちたいとき便利。
CREATE TABLE IF NOT EXISTS users (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
MySQL / PostgreSQL / SQLite で利用可。Oracle は伝統的に未対応で、EXECUTE IMMEDIATE や USER_TABLES の事前判定で代替します。
既存テーブルからコピー(CTAS)
-- 構造とデータをまとめてコピー
CREATE TABLE employees_backup AS
SELECT * FROM employees;
-- 構造だけ(WHERE で 0 件にする)
CREATE TABLE employees_empty AS
SELECT * FROM employees WHERE 1 = 0;
一時テーブル / グローバル一時テーブル
-- セッション内だけ生きる一時表
CREATE TEMPORARY TABLE tmp_log (
id INT, msg VARCHAR(200)
);
テーブル作成後によくやること
- インデックス追加:
CREATE INDEX idx_emp_name ON employees(emp_name); - コメント付与(PostgreSQL):
COMMENT ON COLUMN employees.emp_name IS '従業員名'; - テーブル変更:
ALTER TABLE employees ADD COLUMN phone VARCHAR(20); - 削除:
DROP TABLE employees;
よくあるトラブル
| 症状 | 原因 |
|---|---|
| 「table already exists」 | 同名テーブルがある。IF NOT EXISTS か DROP 先行 |
| 「invalid identifier」 | 予約語と衝突。バッククオートや二重引用符で囲む |
| 外部キーで作成失敗 | 親テーブル未作成 / 親列が UNIQUE/PRIMARY KEY でない / 型不一致 |
| NOT NULL で INSERT 失敗 | 該当列を必ず指定 / DEFAULT を付与 |
FAQ
Q: 列の順序は重要?
A: 論理的には任意ですが、INSERT 値の暗黙的な順序や、人間が読む際の自然さに影響します。主キーを先頭にまとめる慣習が一般的。
Q: 型は後から変えられる?
A: ALTER TABLE ... ALTER COLUMN(DBMS によって構文差)で可能ですが、データの再整形・ロックが発生するので慎重に。
Q: 複合主キーと代理キー、どちらがいい?
A: 多くの現場では代理キー(id INT AUTO_INCREMENT)を主キーにし、業務上の一意性は UNIQUE 制約で表現します。
関連
- 表関連 — 親カテゴリ
- ALTER TABLE / DROP TABLE
- CREATE INDEX — 索引
- 主キー / 外部キー / NOT NULL / UNIQUE
- 正規化 / データ型設計
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?