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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

11538閲覧

postgresql:テーブル作成について

mk222222

総合スコア59

PostgreSQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/09/01 23:37

テーブル作成の構文が知りたい

複合キーのあるテーブルの複合キーを
ほかのテーブルの外部キーとして使いたいが上手く書けません。

発生している問題・エラーメッセージ

ERROR: there is no unique constraint matching given keys for referenced table "reservable_room"

該当のソースコード

create table reservation( reservation_id serial primary key, start_time time not null, end_time time not null, reserved_date date not null,- room_id int references meeting_rooom(room_id), user_id varchar(255) references usr(user_id), FOREIGN KEY(reserved_date) references reservable_room(reserved_date)--ここがうまくいってない? ); //下三つのテーブルは作成済み create table reservable_room( reserved_date date, room_id int references meeting_rooom(room_id), primary key (reserved_date,room_id) ); create table usr( user_id varchar(255) primary key, first_name varchar(255) not null, last_name varchar(255) not null, pass varchar(255) not null, role_name varchar(255) not null ); create table meeting_rooom( room_id serial primary key, room_name varchar(255) not null );

試したこと

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

下記の記事(QAですが)が参考になりそうです。

ERROR: there is no unique constraint matching given keys for referenced table "xxxx"のようなPostgreSQLエラーを受け取った場合、それは外部キーの作成の失敗が原因です。

PGSQLで外部キーを宣言するためには、ユーザーが覚えておくべきポイントがいくつかあります:
1.FOREIGN KEY制約は、PRIMARY KEYまたはUNIQUE制約を参照しなければなりません。
2.2つのキーフィールドは、互換性のあるデータタイプでなければなりません。
3.参照するテーブルと参照されるテーブルの両方のREFERENCES権限を持っていなければなりません。

この中の1つ目に引っかかっているように思います。
外部キーを貼られるカラムがPRIMARY KEYもUNIQUEもついていないように見受けられます。
一意であることが確約されていないとどのデータを参照していいか判断できませんね。

投稿2018/09/01 23:47

編集2018/09/02 05:43
m.ts10806

総合スコア80850

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

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

m.ts10806

2018/09/02 01:10

色々検証した上で回答したかったのですが、ちょっと夜までかかれそうにないので、 2つ目、3つ目の観点からも見てみてください。
mk222222

2018/09/02 05:25

素早いアドバイスありがとうございました!
m.ts10806

2018/09/02 05:43

あれ?saziさんの回答からすると離れてはなさそうですね。 解決できたようで何よりです
guest

0

ベストアンサー

外部キー制約はプライマリーキーに合わせる必要があります。
また作成や削除では依存関係の考慮が必要です。※作成は順序
以下の様にすると作成できます。

SQL

1drop table if exists usr cascade; 2drop table if exists meeting_rooom cascade; 3drop table if exists reservable_room cascade; 4drop table if exists reservation; 5create table usr( 6 user_id varchar(255) primary key, 7 first_name varchar(255) not null, 8 last_name varchar(255) not null, 9 pass varchar(255) not null, 10 role_name varchar(255) not null 11); 12create table meeting_rooom( 13 room_id serial primary key, 14 room_name varchar(255) not null 15); 16create table reservable_room( 17 reserved_date date, 18 room_id int references meeting_rooom(room_id), 19 primary key (reserved_date,room_id) 20); 21create table reservation( 22 reservation_id serial primary key, 23 start_time time not null, 24 end_time time not null, 25 reserved_date date not null, 26 room_id int references meeting_rooom(room_id), 27 user_id varchar(255) references usr(user_id), 28 FOREIGN KEY(reserved_date,room_id) references reservable_room(reserved_date,room_id) 29);

投稿2018/09/02 01:11

編集2018/09/02 01:17
sazi

総合スコア25195

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

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

mk222222

2018/09/02 05:24

テーブル作成出来ました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問