質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

3回答

4403閲覧

sqlファイルを実行してデータベースとその内部にテーブルを作成する方法(PostgreSQL)

yochun02

総合スコア76

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

1クリップ

投稿2019/05/23 12:29

編集2019/05/23 12:31
やりたいこと

最近データベースを勉強している者です。
PostgreSQLで予め作成しておいたsqlファイルをコマンドラインから実行してテーブルの入っているデータベースをセットで作成したいと思っていますがなかなか思い通りに行っていません。

現状

調べたところ、データベース名_(アンダースコア)テーブル名でcreate文を書くというものが有りましたが、テーブル名にデータベース名_が一緒に入ってしまいます。

PostgreSQL

1-- 例  2-- データベース名:sampledatabaseの中にテーブル名:sampletableを作成したい場合 3 4DROP DATABASE IF EXISTS sampledatabase; 5CREATE DATABASE sampledatabase; 6 7DROP TABLE IF EXISTS sampledatabase_sampletable; 8CREATE TABLE sampledatabase_sampletable( 9hoge SERIAL PRIMARY KEY 10);

実行結果は、sampledatabaseという名前のデータベースの中にsampledatabase_sampletableというテーブル(レコードはhoge)が生成されてしまいます。createで同時にデータベースと一緒にテーブルを中に作成はできてはいますが...
上の例の場合、データベースsampledatabaseの中にテーブルsampletableを作成することはできないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

sampledatabaseという名前のデータベースの中にsampledatabase_sampletableというテーブル(レコードはhoge)が生成されてしまいます。

SQL

1CREATE TABLE sampledatabase_sampletable(hoge SERIAL PRIMARY KEY);

そうなるように指定していますからね。

データベースsampledatabaseの中にテーブルsampletableを作成することはできないでしょうか?

SQL

1CREATE TABLE sampletable(hoge SERIAL PRIMARY KEY);

テーブル名をそのように指定するだけです。


ところで、ログインロールは追加されて実行されていますか?
postgresの場合以下の順序でDBを構築します。
1.ログインロール
2.データベース
3.スキーマ
4.テーブル

インストール直後は、以下のような状態です。
1.ログインロール:=:インストール時に指定したユーザー(管理者権限)
2.データベース :=:通常はpostgres
3.スキーマ   :=:public

この状態にインストール直後のユーザーでログインして、質問の内容を実行する場合、
以下の様な手順になると思います。
1.データベース(sampledatabase)作成
2.sampledatabaseへログイン
3.テーブル作成。[スキーマ(public)配下にテーブルが作成されます。]

ログインロールと合わせたスキーマ名を作成した上で、テーブルを作成する事をお勧めします。

投稿2019/05/23 12:49

編集2019/05/23 13:03
sazi

総合スコア25206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yochun02

2019/05/23 13:05

ログインはデータベースのルート?(postgres)で入っています。実行は postgres=# \i createSample.sql (上のサンプルデータ) もし、上のスクリプトで該当箇所を sampledatabase_sampletable -> sampletableとすると、直下のpostgresデータベースにsampletableが作成されてしまいます。(sampledatabaseは別に作成(中身は空)) スキーマはpublicに設定されています。
yochun02

2019/05/23 13:17 編集

すみません。回答してくださった後半の文章をよく見ていませんでした。 要はデータベースは先に作成しておき、sqlスクリプトファイルの中身にはテーブルの作成のみ記述するべき(データベースとテーブルをセットに作成することはできない?)ということでしょうか?
sazi

2019/05/24 00:10 編集

データベース名:postgresにログインして別なデータベースを作成しても、まだデータベース名:postgresにログインしてますから、そこでテーブルを作れば当然postgresに作成されます。 なので、作成したデータベースにログインしないと駄目です。 \c <DB_NAME> でデータベースの切り替えができます。
yochun02

2019/05/24 00:34 編集

解決しましたありがとうございます
sazi

2019/05/24 00:38 編集

2つのファイルに分ける場合は、 postgres=# \i createdatabase.sql postgres=# \c sampledatabase sampledatabase=# \i createSample.sql とすれば良いだけですが、そんなに不都合がありますか?
guest

0

CREAT DATABASESとCREATE TABLEの文の間に
\c database
のメタコマンドを入れるだけでした。
前に試したときにダメだったので記述できないと勘違いしていました。(おそらく;をつけていた)
回答してくださった方ありがとうございました。非常に参考になりました。

投稿2019/05/24 00:34

yochun02

総合スコア76

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

以下、間違ってるので絶対に参考にしないようにしましょう。

kenko

1DROP TABLE IF EXISTS sampledatabase_sampletable; 2CREATE TABLE sampledatabase_sampletable( 3hoge SERIAL PRIMARY KEY 4);

のような書き方をするのならアンダースコアではなくドットでは?

daiichi

1DROP TABLE IF EXISTS sampledatabase.sampletable; 2CREATE TABLE sampledatabase.sampletable( 3hoge SERIAL PRIMARY KEY 4);

投稿2019/05/23 14:27

編集2019/05/23 15:56
hentaiman

総合スコア6426

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/05/23 15:50 編集

その修飾はスキーマを指します。存在しないのでエラーになります。
hentaiman

2019/05/23 15:44

その前にcreate databaseしてるけど存在しない?すいません道端の雑草レベルの私には分かりません。けど間違っているようなので気を付けます。ありがとうございました。
sazi

2019/05/23 15:51 編集

データベース作成直後に存在するスキーマはpublicのみです。 postgresはデータベース>スキーマ>テーブル、という構成です。 なので、スキーマ.テーブルという修飾をします。 また、データベース.スキーマ.テーブル というような修飾はできません。
sazi

2019/05/23 15:54

誤った情報が残ってしまいそうな場合には、コメントするようにしています。
hentaiman

2019/05/23 15:57

はい。参考にするなって書いときました。
yochun02

2019/05/24 00:20

回答ありがとうございます。ドットでの指定でエラーはこの質問をする前に自分も経験していたので大丈夫です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問