transactionDetailのPrimaryKeyはどのフィールドを用いればいいでしょうか

September 2021 編集されました カテゴリ: POS

POSからAPIを使用してtransactionとtransactionDetailを取得するアプリケーションを作成しています。

transactionDetailを取得する際は、transactionIdとtransactionDetailIdを結合し、ユニークな値として取得しています。


ある日、取得したdetailが重複していました。

確認すると、本番環境ではtransactionDetailIdが 1,2,3,4 と連番で4行あるのに対し、取り込んだデータは 1,5,6,7と番号が飛んでいることが判明しました。

その後、テストを行い、POS管理画面にて取引履歴詳細の編集ボタンから編集した場合、transactionDetailIdを連番で再割り当てしていることがわかりました。

(例:detailIdが 1,5,6 のtransactionを編集した場合は、保存時に 1,2,3 と再割り当てがされる)

detailIdをPrimaryKeyとして使用していたので、これはまずいと思いましたが、transactionDetailテーブルには、他にPrimaryKeyとして用いることのできるフィールドがなさそうでした。

識別IDというのもありましたが、これも一部重複しているものがありました。


どうすればdetailのレコードのユニーク値を取得できるでしょうか。

答え

  • @岩崎 月斗

    平素より、スマレジ・ディベロッパーズのご利用ありがとうございます。

    回答にお時間がかかっており誠に申し訳ございません。


    お問い合わせいただいた取引明細のユニークキーの件ですが、現在社内で調査を進めております。

    本件につきましては近日中に1次回答をいたします。

    今しばらくお時間がかかりますこと、重ねてお詫び申し上げます。

  • September 2021 編集されました

    @岩崎 月斗

    ご質問いただいた内容について、弊社で詳しく確認させていただきたいので、

    恐れ入りますが以下の情報をご教示いただけますでしょうか。

    ※こちらは個人情報が含まれている場合もございますので、お手数ですがsupport@smaregi.jpあてにお送りいただければと存じます。


    ・開発環境の契約ID

    ・現象の発生する取引ID

    ※transactionIdのみか、可能であれば現在のtransactionDetailIdも記載ください


    ・本番環境の契約ID

    また本番環境になる為、わかればで構いませんので以下の情報もご教示くださいませ

    ・アカウントID

    ・ワンタイムパスワード

    ※管理画面右上の白い三本線ボタンをクリックし、「マイアカウント」画面より確認ができます。


    以上、よろしくお願いいたします。

  • @岩崎 月斗

    詳細な情報をお送りいただきましてありがとうございます。

    いただいた内容をもとに弊社で状況を精査させていただき、返信させていただきます。

    恐れ入りますが回答までお待ちくださいますようお願いいたします。

  • @岩崎 月斗

    お時間頂戴しており申し訳ございませんでした、ご回答致します。


    取引明細IDは主キーとしてよりもシーケンス番号くらいの立ち位置で、レコードを永続的に一意に決めるものではありません。

    APIで取引登録をする際は取引明細IDをご自身で設定できますが、管理画面やアプリなどで取引編集を行うと明細IDが再採番されることがございます。


    スマレジ内の取引データと貴アプリの取引データを同期させることが岩崎様の行いたいことだと存じますので、

    下記手順で行っていただけますと幸いです。

    1. webhookにて取引が編集されたことを検知したとき / もしくは既知の取引を利用したいタイミングが来たとき
    2. 取引取得APIで取引ヘッダと明細を取得
    3. 御自身のDBとupdateではなくdelete-insertで同期


    よろしくお願いいたします。

  • ありがとうございます。

    そうさせていただきます。


    となると、取引明細のプライマリキーは何になるんでしょうか。

    データーベースのテーブルに、プライマリキーが存在しないというのは考えにくいのですが

  • @岩崎 月斗

    ご認識の通り、プライマリキーはTransactionHeadIdTransactionDetailIdの複合です。

    TransactionDetailIdは操作によって変更される場合がありますが、それによってTransactionHeadId + TransactionDetailIdの組み合わせが弊社のデータベース内で重複することはございません。