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

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

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

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

Q&A

解決済

2回答

309閲覧

INSERTするとなぜかデータが2件登録される。

ayanon

総合スコア12

PostgreSQL

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

0グッド

0クリップ

投稿2018/07/25 09:34

編集2018/07/25 09:36

Postgresを使用しているのですが、以下を実行するとデータが2行入ってしまいます。

sql

1insert into per_samplesample values(1, 'あいうえお');

上記を実行してから以下を実行すると、同じ主キーのデータが2行あるようです。

sql

1select * from per_samplesample; 2-- -> 2件表示 3id | remark 41 | あいうえお 51 | あいうえお 6 7select * from per_samplesample_1; 8-- -> 1件表示 9id | remark 101 | あいうえお

なんでこうなるのでしょうか?

sql

1-- 関数 2CREATE OR REPLACE FUNCTION per_samplesample_trigger_func() 3RETURNS TRIGGER AS $$ 4BEGIN 5 IF ( NEW.id = 1) THEN 6 INSERT INTO per_samplesample_1 VALUES (NEW.*); 7 ELSIF ( NEW.id = 2) THEN 8 INSERT INTO per_samplesample_2 VALUES (NEW.*); 9 ELSIF ( NEW.id = 3) THEN 10 INSERT INTO per_samplesample_3 VALUES (NEW.*); 11 ELSE 12 RAISE EXCEPTION 'Data out of range. Fix the per_samplesample_trigger()'; 13END IF; 14RETURN NEW; 15END; 16$$ 17LANGUAGE plpgsql;] 18 19-- トリガー 20CREATE TRIGGER per_samplesample_trigger 21 BEFORE INSERT ON per_samplesample 22 FOR EACH ROW EXECUTE PROCEDURE per_samplesample_trigger_func(); 23 24 25-- テーブル 26CREATE TABLE per_samplesample ( 27 id int not null, 28 remark varchar(100), 29 PRIMARY KEY(id) 30); 31 32CREATE TABLE per_samplesample_1 ( 33 CHECK ( id = 1 ) 34) INHERITS (per_samplesample); 35CREATE TABLE per_samplesample_2 ( 36 CHECK ( id = 2 ) 37) INHERITS (per_samplesample); 38CREATE TABLE per_samplesample_3 ( 39 CHECK ( id = 3 ) 40) INHERITS (per_samplesample); 41

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

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

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

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

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

guest

回答2

0

ベストアンサー

トリガーで追加しているからです。
パーティショニングする場合には、トリガーで別テーブルに振り分けているのだから、結果はNUllを返却するようにしないと。

SQL

1-- 関数 2CREATE OR REPLACE FUNCTION per_samplesample_trigger_func() 3RETURNS TRIGGER AS $$ 4BEGIN 5 IF ( NEW.id = 1) THEN 6 INSERT INTO per_samplesample_1 VALUES (NEW.*); 7 ELSIF ( NEW.id = 2) THEN 8 INSERT INTO per_samplesample_2 VALUES (NEW.*); 9 ELSIF ( NEW.id = 3) THEN 10 INSERT INTO per_samplesample_3 VALUES (NEW.*); 11 ELSE 12 RAISE EXCEPTION 'Data out of range. Fix the per_samplesample_trigger()'; 13END IF; 14RETURN NULL; -- ←ココ 15END; 16$$ 17LANGUAGE plpgsql;]

投稿2018/07/25 10:59

sazi

総合スコア25195

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

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

0

INHERITS で作られたテーブルは、親テーブルと強く相関します。そして、通常、親テーブルの検索結果には、子テーブルの内容が含まれます
参考:PostgreSQL マニュアル

よって、この出力結果は、親テーブルの物と、子テーブルに(before insert の結果)登録された物との2行が出ているのです。

投稿2018/07/25 09:46

tacsheaven

総合スコア13703

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問