導入: なぜCREATE TABLE … LIKEが重要なのか
データベース運用において、「既存テーブルとほぼ同じ構成のテーブルを素早く作成したい」というケースは頻繁に発生します。例えば、ログの月次アーカイブテーブルの作成や、本番環境のテーブル定義をステージング環境へ複製する際などです。
手動でCREATE文を書き起こすのは手間がかかるだけでなく、カラム定義や制約の書き漏らしといったヒューマンエラーの原因にもなります。PostgreSQLの CREATE TABLE … LIKE 構文を活用すれば、既存テーブルの構造を正確かつ瞬時にコピーできるため、作業効率と品質を大幅に向上させることができます。
基礎知識: LIKE句の仕組みと「継承」との違い
CREATE TABLE … LIKE は、指定したテーブルの「カラム名」「データ型」「NOT NULL制約」を自動的に継承して新しいテーブルを作成する機能です。
ここで注意すべき点は、この機能は「データ」はコピーしないという点です。また、後述するオプションを指定しない限り、インデックスやCHECK制約などはコピーされません。
よく混同される概念として INHERITS(テーブル継承) がありますが、こちらは「親テーブルと子テーブルが親子関係を持つ」ものであり、親へのクエリが子テーブルも参照するなどの連動性があります。一方で LIKE で作成されたテーブルは、作成後は完全に独立した別個のテーブルとして扱われるため、実務上の「ひな形作成」にはこちらが適しています。
実装: 具体的な手順
基本的な構文は以下の通りです。
CREATE TABLE 新規テーブル名 (
LIKE コピー元テーブル名 [オプション…]
);
実務では、単にカラムをコピーするだけでなく、インデックスやデフォルト値も引き継ぎたいケースが多いため、オプションを適切に組み合わせるのが定石です。
サンプルプログラム: 実践的なテーブルコピー例
以下は、既存の「orders」テーブルを元に、インデックスやデフォルト値を含むコピーテーブルを作成する例です。
— 1. コピー元となるテーブル(例:orders)が存在すると仮定
— 2. 構造、デフォルト値、インデックスを含めてコピーを作成
CREATE TABLE orders_backup_2024 (
— LIKE句で既存テーブルを指定
— INCLUDING DEFAULTS: デフォルト値をコピー
— INCLUDING INDEXES: 主キーやユニーク制約を含むインデックスをコピー
LIKE orders INCLUDING DEFAULTS INCLUDING INDEXES
);
— 確認: 作成されたテーブルの定義を確認する
— psql等のクライアントで以下のメタコマンドを実行
— \d orders_backup_2024
— 3. (必要に応じて)データを移行する
INSERT INTO orders_backup_2024 SELECT FROM orders WHERE order_date < '2024-01-01';
応用・注意点: 現場で役立つTips
1. INCLUDING ALL の活用
細かいオプションを一つずつ指定するのが面倒な場合は、INCLUDING ALL を使用することで、制約、インデックス、コメント、統計情報など全てをコピーできます。ただし、シーケンス(IDENTITY属性)などはコピー先で個別に管理される点に注意してください。
2. 複数テーブルの統合
もし「複数のテーブル構成を合体させた新しいテーブル」を作りたい場合、以下のように複数のLIKE句を記述可能です。
CREATE TABLE combined_table (
LIKE table_a,
LIKE table_b
);
※ただし、両方のテーブルに同じ名前のカラムが存在するとエラーになるため、事前にカラム名を整理しておく必要があります。
3. 陥りやすいバグ:データの重複
LIKE 句はあくまで構造のコピーであり、データは含まれません。もし「データも含めてコピーしたい」場合は、別途 CREATE TABLE AS SELECT FROM … を検討してください。ただし、この方法はインデックスや制約がコピーされないという欠点があるため、「制約付きでデータも欲しい」という場合は「LIKEで構造作成」+「INSERT INTO … SELECT」の2ステップで進めるのが最も安全かつ確実です。

コメント