• ベストアンサー

NULL か UNIQUE な列は作成可能?

いつもお世話になっております。 テーブルの作成時に主キーのようにUNIQUEになるように 列を設定したいと思います。ただし値が設定された場合に のみUNIQUEとしたいのです。つまりNULLかUNIQUE。 そういうのは可能でしょうか? プログラム側で重複しないようにチェックする しかないですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • yamada_28
  • ベストアンサー率43% (21/48)
回答No.2

主キーを動的に変更したいのですよね?であれば無理です。 NULLを許可する列は主キーに設定できないからです (やってみればわかりますが、SQLServerから怒られます)。 それができるのであれば主キーの意味はなくなりますよー

その他の回答 (3)

  • 7marine
  • ベストアンサー率36% (59/160)
回答No.4

ANo.3です。 間違いがありました insert T(col1) select N'bbb' as col1 union select N'ccc' のようなinsertに対応してませんでした。 この行を if (select count(*) from T where exists(select * from inserted where inserted.col1=T.col1)) >= 2 このように三行に変更してください declare @er nvarchar(10) select top 1 @er = col1 from T where exists(select * from inserted where inserted.col1=T.col1) group by col1 having (count(*) >= 2) if @er is not null

  • 7marine
  • ベストアンサー率36% (59/160)
回答No.3

/* 主キーは別に存在して 別にUniqueでNullの許容の列が存在すると 解釈して回答します プログラムで処理したくないなら トリガーを使用するしかありません insert,update時に調査させてもし重複ならエラーで rollbackさせています。 後はエラーの原因を突き止めて再度、更新作業をしてください (注意) 一度insertが発生するのでrollbackしても主キーの連番は飛びます */ --テーブル create table T( pk int identity(1,1), col1 nvarchar(10) ) go --トリガー create trigger trigger_T on T for insert,update as if (select count(*) from T where exists(select * from inserted where inserted.col1=T.col1)) >= 2 begin raiserror('重複だよ',16,1) rollback tran end go --insert insert T(col1) values(null) insert T(col1) values(null) --これはOK insert T(col1) values(N'aaa') insert T(col1) values(N'aaa') --エラーになります --update update T set col1=null --これはOK update T set col1=N'aaa' --エラーになります select * from T

回答No.1

まず、意味がよくわかりません。 テーブルに ・Nullで登録しようとしたら、自動で空番号を採番し、登録を行う ・値を設定したら、その番号をそのまま登録を行う というカラムを作成したいということ? もしそうだとしたら、、、 値を設定したりしなかったりする項目に対し、設定する場合もユニーク値なのですよね? 言われている仕様が、最初から重複チェックロジックが生まれるような作りだと思います。 そのテーブルが、どれほどのデータ件数に膨らむ予想を立てましょう。 ・マスタ系みたいな、ほとんど稼動時からあまり変更が無いテーブルの場合 ⇒プログラムだけで解決しちゃっても良いかと思います。(件数にもよりますが^^;) ・販売実績みたいなトランザクション系で、逐次更新されるテーブルの場合 ⇒採番テーブルを別に設け、管理をしないと処理が遅くなります。 ⇒Null可項目に予めしておき、トリガにて「Nullなら裁判を行う」としておくと、Nullが有り得ない状態でできると思います。

関連するQ&A