2 つの列 ("Int_1" と "Int_2") に挿入しようとしている値が既に存在するレコードが存在する場合、レコードを挿入できないように、テーブルにチェック制約を実装しようとしています。例えば:
ID Name Int_1 Int_2
1 Dave 1 2
上記のテーブルに (2, Steve, 2, 2) を挿入することは (3, Mike, 1, 3) と同様に問題ありませんが、Int_1 と Int_2 が既に存在する場所に値を挿入することはできません。つまり、(4, Stuart, 1 、2) は違法です。
このようにテーブルを定義するとうまくいくと思いました:
CREATE TABLE [Table](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](255) NOT NULL,
[Int_1] [int] NOT NULL,
[Int_2] [int] NOT NULL,
CONSTRAINT [chk_Stuff] CHECK (dbo.chk_Ints(Int_1, Int_2)=1))
ここで、dbo.chk_Ints が定義されています。
CREATE FUNCTION [dbo].[chk_Ints](@Int_1 int,@Int_2 int)
RETURNS int
AS
BEGIN
DECLARE @Result int
IF NOT EXISTS (SELECT * FROM [Table] WHERE Int_1 = @Int_1 AND Int_2 = @Int_2)
BEGIN
SET @Result = 1
END
ELSE
BEGIN
SET @Result = 0
END
RETURN @Result
END
GO
上記のコンボを使用する場合、任意のレコードを挿入しようとすると、SQL はチェック制約を破ったことを通知します。テーブルからすべての行を削除して最初のレコードを挿入しようとすると、SQL は制約を破ったことを通知します。
UDF が複数のテーブル列に依存するチェック制約の例を探して、かなり長い間インターネットを精査してきましたが、役に立ちませんでした。なぜこれがうまくいかないのかについてのアイデアはありますか?
前もって感謝します :)