SE基本情報に出るIT用語

「一意制約に反しています」とは?主キーが重複してる状態

データベースのOracle(オラクル)で見る、「一意制約に反しています」とは、主キーが重複してる状態です。「一意制約違反」って言ったります。

postgreSQLだと、「UNIQUE制約」ですが同じこと。

Oracleの公式ドキュメントを見ると、「ORA-00001: 一意制約(String.String)に反しています」

※「そもそも、それって何やねん!」的な人向けに書いてます。

主キーは、学生番号とか会員番号とか伝票番号みたいに、「他と重複することがなく、空(Null)になりえない情報」のこと。もっと言えば、「それだけで1行が特定できる情報」なので、「ダブるのは許さんぜ」って話です。

スポンサーリンク

一意制約違反は、主キーが重複している状態。その原因は5つ

「一意制約違反」とは、主キーが重複してる状態です。「あぁ、なるほどね」となってもらえれば、ここで終わってもいいのですが、実際の業務で起こりうる状況が、パッと5つ思いついたので、簡単に書いておきます。

一意制約違反(主キーの重複)が起こりうる状況
  • 主キーが同じのinsert文が2回実行された
  • update文で主キーを書き換えた結果、キーが重複
  • CSVを取り込んでその内容をinsertする時に、同じ主キーのレコードが2つ以上あった。他システムからやってきたCSVに「グサッ」とされることも、よ~くある話(他システムAは、他システムBの一意制約なんて、知ったこっちゃないってこと)。
  • 前段の処理がおかしい。本来、物理削除(ガベージ)されるはずのデータが、生き残っていて、シーケンスや採番が一巡した結果、キー重複。総合テストなどで発見できればいいけど、本番環境でやったらめっちゃ怒られるやつ(汗)
  • マテリアライズド・ビュー(マテビュー)のリフレッシュをした瞬間に、一意制約違反。単純コピーのマテビューでは起こりえないが、unionとかgroup byの結果、あるいは「適用期間」みたいな項目のBETWEENの条件がおかしくて、キー重複

「3番目と4番目と5番目だけ、やたらリアルに書かれていないか?」と思った人もいるかも。・・・まぁ、そういうことです(*´ω`)。

スポンサーリンク

一意制約違反の対処方法は3つ

一意制約違反の対処方法は3つ。

一意制約違反(主キーの重複)の対処方法
  1. コーヒーを飲みながら、該当のトランザクションロールバックされたことを確認
  2. 一意制約違反を起こしているデータを確認して、「すでにあるデータを消すか?」、「insert(update)をあきらめるか?」を決める
  3. 一意制約違反するようなデータが、「なぜすでにあるのか?」、「なぜinsert(update)されようとしたのか?」を調査する

本番環境で対応するとなった場合は、「ひとまず、ダブっているデータをどうするか?」から決めて、後続の処理の続行可否を判断するところから。

ちなみに、マテビューで起こったとしたら、ひよこSE(@PiyoOct)の経験上、「マテビューのつくりが悪い」というお話に落ち着く可能性が高いので、まずはマテビューのつくりから調査ですね。

※ふつうのテーブルに登録されているのに、マテビューリフレッシュしたときに落ちるってことは、「ほぼマテビューのつくりのお話でしょ」っていう理屈。たぶんね。

まとめ

データベースで見る、「一意制約(UNIQUE制約)に反しています」的なメッセージは、主キーが重複してる状態です。

緊張感ありげに書いてみましたが、実際に本番稼働しているシステムで起こらないことを祈りつつ。

基本情報技術者試験・応用情報技術者試験では、「覚えておけば点になる」というよりも、文中にごく普通に出てくるワードなので、知っておいて損はないはずです(-_-;)。

スポンサーリンク

▼この記事がいいと思ったら、下の画像をクリックしてくれたら励みになります!

にほんブログ村 IT技術ブログ システムエンジニアへ

コメント

タイトルとURLをコピーしました