取り組もうとしたこと
DBeaverでusersとpostsという二つのテーブルを作りたかったとします。
そしてSQLエディタを起動して、下記のSQL文をまとめて1つのファイルで実行しようとします。
CREATE TABLE users (
-- 主キーID(自動採番)
user_id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
-- ユーザー名/アカウント名(必須、重複不可)
username VARCHAR(64) NOT NULL UNIQUE,
-- 表示名(必須)
display_name VARCHAR(128) NOT NULL,
-- メールアドレス(必須、重複不可、認証用)
email VARCHAR(255) NOT NULL UNIQUE,
-- 自己紹介文
bio TEXT,
-- 登録日時(デフォルト値として現在時刻を設定)
created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE posts (
-- 主キーID(自動採番)
post_id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
-- 記事の著者ID (usersテーブルのuser_idを参照)
author_id BIGINT NOT NULL REFERENCES users(user_id),
-- 記事のタイトル(必須)
title VARCHAR(255) NOT NULL,
-- 記事の本文(必須)
content TEXT NOT NULL,
-- 記事のステータス (0: 下書き, 1: 公開済み, 2: 限定公開)
status SMALLINT NOT NULL DEFAULT 0 CHECK (status BETWEEN 0 AND 2),
-- 作成日時
created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
-- 最終更新日時
updated_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
-- 閲覧数
views INTEGER NOT NULL DEFAULT 0
);
-- author_idへのインデックス作成(検索効率向上)
CREATE INDEX idx_posts_author_id ON posts(author_id);
発生した課題
- この行で下記のエラーが発生
-- author_idへのインデックス作成(検索効率向上)
CREATE INDEX idx_posts_author_id ON posts(author_id);
SQL Error [42P01]: ERROR: リレーション"posts"は存在しません
推測
- おそらく
usersテーブルの生成は通っているように見える。 - たぶん上記のエラーはプリコンパイル時の(ような段階で発生する)エラーで、テーブルを生成する命令文になんらエラーはないけれども、この段階ではまだ
usersテーブルは生成出来ていないから、確実にusersテーブルが出来ていることを保証してから、postsテーブルを作ってくれ。ということなのだと思う。
解決策
- 一個ずつテーブルを生成して、テーブルを更新してテーブルがきちんと生成されていることを確認した結果、エラーを解消することが出来た。
まずusersテーブルを作って更新
CREATE TABLE users (
-- 主キーID(自動採番)
user_id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
-- ユーザー名/アカウント名(必須、重複不可)
username VARCHAR(64) NOT NULL UNIQUE,
-- 表示名(必須)
display_name VARCHAR(128) NOT NULL,
-- メールアドレス(必須、重複不可、認証用)
email VARCHAR(255) NOT NULL UNIQUE,
-- 自己紹介文
bio TEXT,
-- 登録日時(デフォルト値として現在時刻を設定)
created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
次にpostsテーブルを作って更新
CREATE TABLE posts (
-- 主キーID(自動採番)
post_id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
-- 記事の著者ID (usersテーブルのuser_idを参照)
author_id BIGINT NOT NULL REFERENCES users(user_id),
-- 記事のタイトル(必須)
title VARCHAR(255) NOT NULL,
-- 記事の本文(必須)
content TEXT NOT NULL,
-- 記事のステータス (0: 下書き, 1: 公開済み, 2: 限定公開)
status SMALLINT NOT NULL DEFAULT 0 CHECK (status BETWEEN 0 AND 2),
-- 作成日時
created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
-- 最終更新日時
updated_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
-- 閲覧数
views INTEGER NOT NULL DEFAULT 0
);
-- author_idへのインデックス作成(検索効率向上)
CREATE INDEX idx_posts_author_id ON posts(author_id);
DBeaverガチ初心者なので間違ってても許してください;;
追記(2025/12/10)
- 上記解消しました。
-
SQL run Queryを押下していたらQuery単位での実行 -
SQL run Scriptを押下していたらScript単位での実行- 複数のSQLのケースだと基本こっちを実行すればよい
-