
下記のようなテーブルがあります。
ID aaa bbb
10 A01
11
12 B01
13 A02
14 A03 B02
・IDは,主キー(レコードの登録時に,IDENTITYで自動的に取得)
・aaa,bbbは,任意のタイミングで入力や編集があるが,ユニーク性を保ちたい
・aaa,bbbの入力に関しては,下記のようなテーブルを作って自動採番にしたい
Category Last_No
A 03
B 02
(1)データベース側にて,aaa,bbbにユニークインデックスを設定すると,
Null値に関しても重複違反になってしまったのですが,
これは,そういうものなのでしょうか?
(2)ユニークインデックスが設定できない場合に,
Null値以外の値が,ユニークである事を保つためには,
どうすれば良いのでしょうか?
自動採番だけでなく,編集も有り得るため,悩んでいます。
(編集は,A01-1のように,枝番を付ける場合が多いです)
以上,どなたかご教示願います。
No.1ベストアンサー
- 回答日時:
ユニーク制約でNULLを除くことができないのは、リンクページに書かれている通りです。
「PRIMARY KEY 制約とは異なり、UNIQUE 制約は NULL 値を許容できます。ただし、UNIQUE 制約が適用される他の値と同様に、NULL 値も 1 列に 1 つしか使用できません。 」
代替案はありますが、導入可否はテーブルデザインのガイドラインとレスポンス要求の程度により判断してください。
具体的には「スカラーファンクションを1つ作成して、チェック制約で使う」というものです。
CREATE FUNCTION [dbo].[ISUNIQUE](@aaa varchar(5))
RETURNS int
AS
BEGIN
IF (SELECT COUNT(*) FROM TABLE1 WHERE aaa=@aaa)>1 RETURN 0
RETURN 1
END
ALTER TABLE TABLE1 ADD CONSTRAINT [CK_aaa] CHECK (dbo.ISUNIQUE(aaa)=1)
こんな感じです。
ユニークフィールドが複合であっても、上記の応用で実現はできます。
(チェック制約に使われた関数は、チェック制約を外さない限りDROPできなくなります)
今回のはいけますが、そもそもチェック制約というのはDELETEのときには働かないことは認識しておいてください。
またここまで踏み込めなければ同じことをトリガやるのもありかと思います(トリガは権限があればオフれるのでそこが違いでしょう)。
参考URL:http://msdn.microsoft.com/ja-jp/library/ms191166 …
jamshid6様
昨日の質問に引き続き,ご回答いただきましてありがとうございます。
ご回答いただいた内容を試し,aaaフィールドに
重複するレコードが登録出来ないことを確認しました。
ですが,これを下記のように利用しようとしたところで,
躓いてしまいました。
1回目の実行で,aaa=A04のレコードが正常に登録された後,
2回目の実行で,制約違反で発生するエラーをトラップしたいのですが,
「INSERTステートメントはCOLUMN CHECKで,制約'CK_aaa'と矛盾しています。」
とのエラー表示となってしまい,処理が中断してしまいます。
クエリアナライザで,
insert TABLE1 values('A04','B03')
print @@error
として,@@errorにて547と返ってくる事を確認しているのですが,
どこが間違っているのでしょうか?
●SQL SERVER 2000のストアド
CREATE PROCEDURE Strd_Test_Add (
@aaa varchar(5),
@bbb varchar(5),
@rowcount int output,
@err int output
)
AS
set nocount on
begin
BEGIN TRANSACTION
insert TABLE1 (aaa,bbb) values(@aaa,@bbb)
select @rowcount=@@rowcount ,@err=@@error
if @err<>0 goto err
COMMIT TRANSACTION
end
return
err:
ROLLBACK TRANSACTION
return
GO
●Excel2003のVBA
Private Sub btn1_Click()
Set dbCN = New ADODB.Connection
dbCN.Open "Provider=SQLOLEDB;" _
& "Data Source=*****;" _
& "Initial Catalog=DB_Test;" _
& "User ID=sa;Password="
Set dbCOM = New ADODB.Command
dbCOM.ActiveConnection = dbCN
dbCOM.CommandType = adCmdStoredProc
dbCOM.CommandText = "Strd_Test_Add"
dbCOM.Parameters.Refresh
dbCOM.Parameters("@aaa") = "A04"
dbCOM.Parameters("@bbb") = "B03"
dbCOM.Execute
MsgBox dbCOM.Parameters("@rowcount").Value _
& vbCrLf & dbCOM.Parameters("@err").Value
Set dbCOM = Nothing
End Sub
No.3
- 回答日時:
SQL Server 2000だったのですね。
私の認識する限りでは、SQL Server 2005のようにエラーを抑え込むTRY/CATCH構文のようなものは2000にはないので、VBAサイドでOn Error Resume Nextを使ってエラーを抑え込むことになると思います。
jamshid6様 度々の回答,ありがとうございます。
On Error Resume Nextにてエラーを回避することにより
VBA側でエラー番号を取得できました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- MySQL SQLで日付別のIDを生成するには 3 2022/10/09 10:34
- JavaScript 指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードを教えてください 2 2023/04/27 17:58
- JavaScript jsonテキストデータの並び替えができるサービスを教えてください 2 2022/08/05 20:16
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PostgreSQLで表結合+DELETEしたい
-
RDB経験者向けのAccess参考書
-
version7,version8 の型の扱い
-
長いSQL文を実行するには?
-
列が存在しないと言われる
-
インデックスの削除と、インデ...
-
SQLで特定データがNULLなら別デ...
-
null→数値にするには?
-
DBから日付順に指定件数の削除...
-
大量データを更新したら、処理...
-
エクセルVBAで5行目からオート...
-
Excel 2019 のピボットテーブル...
-
「直需」の意味を教えてください
-
テーブルの存在チェックについて
-
SQLServer2005のSQL文での別名...
-
エクセルグラフの凡例スペース
-
変数が選択リストにありません
-
Accessのクエリでデータの入力...
-
Accessでテーブル名やクエリ名...
-
Accessファイルを作成者以外は...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PostgreSQLで表結合+DELETEしたい
-
列が存在しないと言われる
-
長いSQL文を実行するには?
-
INSERTできるレコード数を制限...
-
0の除算
-
alter tableすると、処理が止ま...
-
SQLで特定データがNULLなら別デ...
-
DBから日付順に指定件数の削除...
-
constraint と index の違い
-
大量データを更新したら、処理...
-
動的に生成したカラムを使ったF...
-
SQLite:項目が存在しない場合の...
-
DB2 「既存カラムへのnot null...
-
powergres(postgres)にalter文...
-
INSERTできない
-
postgreSQLの日付を変数にする...
-
SQL における変数の宣言と代入...
-
PostgreSQLの「not null」制約...
-
インデックスの削除と、インデ...
-
UPDATE文について
おすすめ情報