以前MySQLでこの問題に直面したことがあります。
具体的には以下で書かれている事象と全く同じです。
こちらの記事です
Postgresでこちらの現象が起こることはあり得るでしょうか?
(DBシステムに依存したロジックを書くことが良いかどうかは置いておいて、Postgresを使う場合でもこの事象を想定して実装するべきでしょうか?)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
MySQLのAUTO INCREMENTはテーブルに属した情報です。
※AUTO INCREMENTはテーブル毎に一つしか指定できないのはその制約からくるものです。
だから、MySQLの再起動でリセットされる仕様というのはありだとも云えます。
問題になったのは、AUTO INCREMENTを他のテーブルとも関連するキーの採番のルールに組み込んでいたからです。
一方PostgresではSEQUENCEとして独立していて、テーブルの定義としてSEQUENCEを関連付ける事で、AUTO INCREMENTを実現させています。
なので、リセットされるような事はありませんが(MySQLも最新ではリセットはされない)、そもそも関連があるのに物理削除していたというのが問題なので、そこはきちんと設計しなければなりません。
投稿2021/02/26 01:38
総合スコア25327
0
MySQLのAUTO INCREMENTはInnoデータベースのテーブルに付随する機能だと捉えていますが、
PostgreSQLでは連番型の説明にもある通り、
serialというデータ型を使うとテーブル名やカラム名から自動命名されるシーケンスによって
連番が生成されるものになっています。
OWNED BY table_name.column_nameされているカラムで
すでにテーブル上に存在している値が使われていても
シーケンスには遠慮も忖度もないので、
シーケンスの定義によって連番生成されたら、
重複してエラーが発生しまうかもしれませんね。
(INSERT INTO文やUPDATE文で妙なことをしなければいいだけの話。)
また、serialで定義された場合はNO CYCLEでしょうから、
nextval参照したときに上限値に達していればエラーになりこそすれ、
重複することはないはずです。
投稿2021/02/26 01:06
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
DBシステムに依存したロジックを書くことが良いかどうかは置いておいて、Postgresを使う場合でもこの事象を想定して実装するべきでしょうか?
逆質問にはなりますが、再利用がなされた場合にどのような状況で困るのでしょうか?
おそらくは、「番号の使い方が悪い」、もしくは「絶対に再利用されれば困る番号なので、採番テーブルを作って厳格に管理するほうがより安全」ということになるのではないかと考えます。
投稿2021/02/26 01:43
編集2021/02/26 02:14総合スコア145973
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/26 01:54
2021/02/26 02:03
2021/02/26 02:12
2021/02/26 02:21 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/26 01:47