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

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

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

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Q&A

解決済

2回答

1124閲覧

Postgresqlの制約で他テーブルの値を参照する事はできないのでしょうか

退会済みユーザー

退会済みユーザー

総合スコア0

PostgreSQL

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

0グッド

0クリップ

投稿2019/04/17 13:23

Postgresqlの制約で他テーブルの値を参照する事はできないのでしょうか

セミナー予約システムで以下テーブルを想定して、申し込みが定員数を超えないようにデータを管理したいと考えております。

 seminars: セミナーマスタ
entries: 申込者情報を管理
entries_seminars: seminarsとentriesの中間テーブル

セミナーの申し込みがあるとentries_seminarsにデータを登録しますが、seminarsに持つ定員数の値以下のレコード数のみ登録できるように、制約を使って定員数の制御をしたいと考えました。

しかし、postgresqlマニュアルの検査制約やドメインの説明に、副問い合わせは使用できないと書いており、また、「サポートされていない機能」の項には「意図的な省略」と記載されています。

DBでの制約で実現できればシンプルかと思いましたが、アプリケーション側で制御を行うべき事なのでしょうか。

ご助言をいただけますと幸いです。
宜しくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

DBでの制約で実現できればシンプルかと思いましたが、アプリケーション側で制御を行うべき事なのでしょうか。

定員を超えている事を画面でどう伝えますか?
トリガーでユーザー定義エラーを発生させて、それで検知しますか?
申し込みキャンセルしたら、データを削除するのでしょうか?それとも論理削除?

ストアドを介したものにするか、アプリケーション側で制御した方が自由度は高いと思います。

投稿2019/04/17 14:26

編集2019/04/17 14:27
sazi

総合スコア25195

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

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

退会済みユーザー

退会済みユーザー

2019/04/17 14:40 編集

ご回答いただきありがとうございます。 > 定員を超えている事を画面でどう伝えますか? > トリガーでユーザー定義エラーを発生させて、それで検知しますか? トリガーで定員チェック → 超過しなければinsert、そうでなければエラー と考えてましたが、アプリ側はDBエラーなのか定員超過エラーなのか判別できないですね。 また、複数処理の同時実行を考えた時に、明示的にロックをかけなければ定員数を超えて登録されてしまう事に気づきました。 > 申し込みキャンセルしたら、データを削除するのでしょうか?それとも論理削除? 物理削除をいたします。 > ストアドを介したものにするか、アプリケーション側で制御した方が自由度は高いと思います。 アプリケーション側で制御する方法を検討してみます。
guest

0

PL/pgSQL言語でトリガーを使って監査する、ってのが近いでしょうか。
41.9. トリガプロシージャ

新たに参加者を記録しようとしたときに、
定員の数をチェックして越えてしまうようなら
例外を発生させてINSERTをキャンセルさせる、みたいな。

投稿2019/04/17 13:37

編集2019/04/17 13:38
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問