- PR -

主キーを更新させるってありですか?

投稿者投稿内容
キリギリス
常連さん
会議室デビュー日: 2004/08/26
投稿数: 33
投稿日時: 2008-06-26 13:53
現在携わっているプロジェクトでテーブル(トランザクション)の主キーを変更(更新)する場合があるそうです。
主キーを変更するってありなんでしょうか?
私は、今まで携わってきた現場では聞いたことがありません。
皆さんの意見をお聞かせ下さい。お願いします。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2008-06-26 14:35
普通は無しだと思います。
関連しているテーブル全てを更新しないといけないですし。。。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-06-26 15:54
後から主キーの値を変更する必要がある場合が考えられるのであれば、それはそのカラムを主キーにするのが間違いで、別途人工キーなどを主キーとして用意したほうがよいと思います。
とはいえ、既に動いてるものはどうしようもないですね…。

引用:

キリギリスさんの書き込み (2008-06-26 13:53) より:
現在携わっているプロジェクトでテーブル(トランザクション)の主キーを変更(更新)する場合があるそうです。


参考までに、その処理はどういった状況で行われるのでしょうか?
関連テーブルがあった場合はどうしているのでしょうか?

# もしかして連鎖更新を設定しておけばいいのかしら
oda-g
会議室デビュー日: 2008/06/26
投稿数: 1
投稿日時: 2008-06-26 15:54
一度だけありました。

某大手の素人SEさんが設計してましたが、色々説明しても理解してもらえませんでした。
実際に作ってから実演してみせて、このような弊害があるよなどの説明をして理解してもらえました。
結局ユーザには承認済みで変更できないとの事で、いろいろ制限をつけて実装しましたけど。。。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-06-26 16:30
引用:

キリギリスさんの書き込み (2008-06-26 13:53) より:
現在携わっているプロジェクトでテーブル(トランザクション)の主キーを変更(更新)する場合があるそうです。
主キーを変更するってありなんでしょうか?


DBMS 的にはできることがほとんどのようです。主キーの更新を許さない DBMS は少数派でしょう。

一方、データーベースアプリケーションとしては、主キーを更新することはあまりやらないとは思います。しかし、だめか?と言えばそうでもないと思います。たとえば、複合主キーを使う場合は、主キーを更新することは少なからず起こるのではないでしょうか。ただ、この場合、これは主キーとして使っているというよりも、ユニークキーとして使っていることが多いかもしれません。

なお、単独の列を主キーとして使う場合、これはポインターのような使い方になりますが、こういう場合は、主キーを更新することはほとんどしないでしょう。

個人的な感想としては、主キーの更新を避けることができるならば、なるべくやらないほうが、なんとなくいいかな、と思います。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-06-26 16:49
自分の場合は、

「主キー」 =「RDB上のレコードを特定するための物理的なキー」
       ⇒不変である

「業務キー」=「業務でのトランザクションを特定するためのキー」
       ⇒キーが変わる可能性がある
       ⇒キーの種類も増える可能性がある

という感じで考えていて、結果として前者と後者が同じでも、
必ず使い分けています。この辺は絶対コレだ!というのがないので、
あくまで自分の趣味でしかありません。

例えば主キーが伝票番号の場合、伝票番号を間違うと、修正する必要が有ります。
また業務の都合で、伝票枝番が発生する可能性もあります。
このとき、主キーを増やす必要が有ります。
こういう場合、プログラムにせよデータ構造にせよ、変更が面倒になります。

仮に主キーが内部IDでしかない場合、更新削除については、
業務キーが増えようと減ろうと、常に内部IDを条件とすればよいので、
データ構造の変更には強いです。

業務キーの組み合わせにおいてユニークであることを保障するなら、
ユニーク制約というのがありますので、
それを使えば十分じゃないかなと思っています。

ちなみに、主キーの更新を行うケースがあるのであれば、
カスケード更新を行う外部制約を付ければ、
更新そのものはそんなに面倒ではないでしょう。

参考までに。
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2008-06-26 16:54
さかもとと申します。

rain様の
>>別途人工キーなどを主キーとして用意したほうがよいと思います。

私も同じ意見です。

以前、同様の案件の保守をやったことがありますがもう最悪でした。
結局、過去数年分にわたって別管理キーを割り振りなおして、でも担当者
が変わった年度に個人ルールが適用されていたようで一致しなくなってて、
あれこれしているうちに結局今の主キー自体がトランと一致してないの
では・・・みたいなことになって、もう大変でした。

こうした案件でもスマートにやりぬける手段があるのかもしれません
が、個人的には主キーの更新は避けたいと思っています。


_________________
------------------------------------------
拝啓、さかもとと申します♪
キリギリス
常連さん
会議室デビュー日: 2004/08/26
投稿数: 33
投稿日時: 2008-06-26 18:23
引用:

rainさんの書き込み (2008-06-26 15:54) より:
後から主キーの値を変更する必要がある場合が考えられるのであれば、それはそのカラムを主キーにするのが間違いで、別途人工キーなどを主キーとして用意したほうがよいと思います。
とはいえ、既に動いてるものはどうしようもないですね…。

引用:

キリギリスさんの書き込み (2008-06-26 13:53) より:
現在携わっているプロジェクトでテーブル(トランザクション)の主キーを変更(更新)する場合があるそうです。


参考までに、その処理はどういった状況で行われるのでしょうか?
関連テーブルがあった場合はどうしているのでしょうか?

# もしかして連鎖更新を設定しておけばいいのかしら



え〜。
そのもしかしての連鎖更新をしています。
まぁ、私の考えではなく上の考えなのでどうしようもないのですが。

スキルアップ/キャリアアップ(JOB@IT)