2017-08-09 66 views
1

我有一个play数据库,可以尝试使用这些数据库,并且已经创建了一个表中包含外键的表。我想限制来自该表中的特定值可以出现在该表中的次数。我希望'本地'表接受来自该外部表的任何值,但最多只能接受四次。我认为这可以通过触发器来完成,但是想知道是否存在某种其他约束或检查可以用来强制执行此规则。原因是我描述的对象最多可以有四个关联的描述符,并且我不希望主表中的四列用于跟踪,因为不是每个项目都会达到该限制;实际上,我相信大多数人不会有两个。限制值在表中出现的次数的方法

+1

触发都会做。还有其他选项可以使用组合键和限制第二列中的值。但在这种情况下,第二列中的增值应该保留在业务层。 – MKR

+0

我同意触发器。您可以在调用函数的表上添加检查约束,但这并不理想。你也可以用其中的逻辑写一个存储过程。 – squillman

回答

2

我会对用户定义的函数使用检查约束。
有使用触发器在这两个好处:

  1. 这是检查约束是专为。
  2. 使用触发器将需要一个替代插入而不是更新触发器,导致代码更长,难以编写和维护。

下面是一个简单的例子:

创建测试表:

CREATE TABLE Test 
(
    Col1 int 
) 
GO 

创建验证功能:

CREATE FUNCTION dbo.IsValueAllowed 
(
    @Value int 
) 
RETURNS bit 
AS 
BEGIN 

IF (SELECT COUNT(*) FROM Test WHERE Col1 = @Value) > 4 RETURN 0 

RETURN 1 

END 
GO 

添加检查约束表

ALTER TABLE Test 
    ADD CONSTRAINT ck_RestrictCol1 CHECK (dbo.IsValueAllowed(Col1) = 1) 
GO 

测试:

INSERT INTO Test VALUES 
(1), (1), (1), (1), 
(2), (2), (2) 

INSERT INTO Test VALUES (2) 

SELECT * 
FROM Test 

INSERT INTO Test VALUES (1) -- This will fail with an error message: The INSERT statement conflicted with the CHECK constraint "ck_RestrictCol1" 

see a live demo on rextester.