2

I am learning to use SQL Server 2012 and I am wondering what is the best way to limit a columm to only allow each value to be entered a maximum number of times?

E.g. a column Color that will only allow Blue to be recorded up to a maximum number of three times?

Thank you.

4

3 に答える 3

1

ストアドプロシージャを使用して挿入を行うことができます。そこで、 ですでに存在するレコードの数を確認できますColor = 'Blue'

CREATE PROCEDURE sp_InsertColor @Color nvarchar(30), @ColorCount int OUTPUT
AS
BEGIN TRANSACTION

SELECT @ColorCount = count(*) 
FROM dbo.ColorTable
WHERE Color = @Color

IF @ColorCount <= 3 
BEGIN
    INSERT INTO dbo.ColorTable(COLOR) VALUES(@Color);
END

COMMIT
GO

次の方法で実行できます。

DECLARE @ColorCount int
EXEC sp_InsertColor @Color = 'Blue', @ColorCount = @ColorCount OUTPUT
SELECT @ColorCount 
于 2012-12-18T16:37:42.230 に答える
1

制約を使用してデータを制約し、db にビジネス ロジックを実装する必要がある (できれば) まれなインスタンスのトリガーを残します (新しい色が挿入された場合は xyz を実行します)。

チェックにバインドされた関数を使用した制約ベースの方法を次に示します。

--setup
create table dbo.Color (ColorId int primary key, ColorName varchar(10), Cap int);
go
create table dbo.Detail (DetailId int identity(1,1), ColorId int references dbo.Color(ColorId));
go

--create color blue with max row cap of 3
insert into dbo.Color
    values(1, 'blue', 3);
go

--create a func to evaluate the max row cap 
create function dbo.IsColorCapped(@ColorId int)
returns bit
as
begin
    return  (   select  case when count(*) > max(c.Cap) then 1 else 0 end
                from    dbo.Color c 
                join    dbo.Detail d on 
                        c.ColorId = d.ColorId
                where   c.ColorId = @ColorId
            )
end;
go

-- use the func in table constraint
alter table dbo.Detail add constraint ck_ColorCap check (dbo.IsColorCapped(ColorId)=0);
go

-- Test...

-- insert 3 blue rows
insert into dbo.Detail (ColorId)
    values(1),(1),(1);

-- insert 4th blue row - FAIL
insert into dbo.Detail (ColorId)
    values(1)
/*
Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "ck_ColorCap". The conflict occurred in database "yak", table "dbo.Detail", column 'ColorId'.
The statement has been terminated.
*/

-- incease the color cap
update dbo.Color
set Cap = 4
where ColorId = 1;

-- insert 4th blue row again
insert into dbo.Detail (ColorId)
    values(1);
于 2012-12-18T23:32:06.440 に答える
0

このスレッドで言及されているストア プロシージャ メソッドは機能しますが、挿入を行うすべてのもので使用される場合にのみ有効です。より良い方法は、同様のロジックを使用してトリガーで強制することです。トリガーは、ルールの施行を保証します。トリガーに挿入された色の数を確認し、それが最大数と等しい場合は、ベイル アウトします。挿入だけでなく、更新も確認することを忘れないでください。

Create TRIGGER [dbo].[ColorTableTrigger] ON [dbo].[ColorTable] 
FOR  Insert 
AS
DECLARE @colorCount int
begin
SELECT @ColorCount = count(*) 
FROM dbo.ColorTable
WHERE Color = inserted.color


If @colorCount = 3  (
        rollback tran
    RAISERROR <some user defined error>
    )
end
end
于 2012-12-18T18:38:49.340 に答える