前提・実現したいこと
こちらの質問の続きです。
前回の質問の経緯を簡単にご説明しますと、
DBにアイテムテーブルmst_item
と、アイテムが入庫された時に書き込まれるトランザクションtrn_item_lot_info
があります。
上記二つのテーブル・トランザクションをjoinし、ビューview_item_result
を作成しました。
そのviewに日内連番・連携したかどうかのbooleanを持たせたいという質問です。
結局は
view専用のテーブルtmp_item_lot_info
を作成、tmp_item_lot_infoにinsertするルールrule_trn_item_lot_info_insert
をtrn_item_lot_infoに作成する
↓
アイテムが入庫される(=trn_item_lot_infoにinsertされる)
↓
insertでruleに基づき、tmp_item_lot_infoにデータがinsertされる
↓
tmp_item_lot_infoをselectしているviewに反映される
という流れに落ち着きました。
発生している問題・エラーメッセージ
プログラムからtrn_item_lot_infoにデータを複数insert(トランザクションでまとめている)する場合があります。
その際、tmp_item_lot_infoに複数データがinsertされてしまうと日内連番が同じになってしまうようです。
1つだけinsertされると特に問題ありません。
この連携は専用の機能なので、できればプログラム(VB.NET)を触らずにSQLだけで解決したいです。
該当のソースコード
mst_item
[PK]item_id(serial) | item_code(varchar(20)) | item_name(varchar(128)) |
---|---|---|
1 | ITEM001 | アイテム① |
2 | ITEM002 | アイテム② |
3 | ITEM003 | アイテム③ |
trn_item_lot_info
[PK]item_id(integer) | [PK]lot_number(varchar(20)) | quantity(numeric(16,6)) | shelf_life(date) |
---|---|---|---|
1 | 2019080801 | 1.000000 | 2020-08-08 |
2 | 2019080801 | 2.000000 | 2020-01-01 |
1 | 2019080901 | 10.000000 | 2020-08-09 |
trn_item_lot_info.rule_trn_item_lot_info_insert
SQL
1CREATE OR REPLACE RULE rule_trn_item_lot_info_insert AS 2 ON INSERT TO trn_item_lot_info DO INSERT INTO tmp_item_lot_info (item_code, quantity, lot_number, shelf_life, seq_in_date, is_coordinated, insert_timestamp) 3 VALUES (( SELECT mst_item.item_code 4 FROM mst_item 5 WHERE mst_preparation.preparation_id = new.preparation_id), 6 new.quantity, 7 new.lot_number, 8 new.shelf_life, 9 CASE 10 WHEN (( SELECT max(tmp_item_lot_info.seq_in_date) AS max 11 FROM tmp_item_lot_info 12 WHERE tmp_item_lot_info.insert_timestamp::date = CURRENT_DATE 13 GROUP BY tmp_item_lot_info.insert_timestamp::date)) IS NULL THEN 1 14 ELSE (( SELECT max(tmp_item_lot_info.seq_in_date) AS max 15 FROM tmp_item_lot_info 16 WHERE tmp_item_lot_info.insert_timestamp::date = CURRENT_DATE 17 GROUP BY tmp_item_lot_info.insert_timestamp::date)) + 1 18 END, -- ここの書き方が悪いのだと思います。 19 FALSE, 20 CURRENT_TIMESTAMP 21 );
tmp_item_lot_info
|item_code(varchar(20))|quantity(numeric(16,6))|lot_number(varchar(20))|shelf_life(date)|seq_in_date(integer)|is_coordinated(boolean)|[PK]insert_timestamp|
|:--|:--|:--|:--|:--|:--|
|ITEM001|1.000000|2019080801|2020-08-08|1|false|2019-08-08 08:00:00.000000|
|ITEM002|2.000000|2019080801|2020-01-01|2|false|2019-08-08 12:00:00.000000|
|ITEM001|10.000000|2019080901|2019-08-09|1|false|2019-08-09 08:00:00.000000|
試したこと
MAXではなくCOUNTを使用してみたのですが同様にダメでした。
ruleでinsertされるデータだけトランザクション無しに出来ればいいのかなと思うのですが。
補足情報(FW/ツールのバージョンなど)
PostgreSQL 9.3
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。