2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【DBeaver】SQL Editor経由で複数テーブルを同時生成することは難しい|SQL Error [42P01]: ERROR: リレーション"TABLE NAME"は存在しません

2
Last updated at Posted at 2025-12-09

取り組もうとしたこと

DBeaverでuserspostsという二つのテーブルを作りたかったとします。
そして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のケースだと基本こっちを実行すればよい
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?