查找SQL约束:从tBoss1的id从tBoss组中选择id中的id

查找SQL约束:从tBoss1的id从tBoss组中选择id中的id,sql,count,constraints,Sql,Count,Constraints,我想限制表中的条目。让我们假设在表tBoss中。是否存在检查表中当前有多少元组的SQL约束?像 SELECT COUNT(*) from tBoss < 2 火鸟说: 无效令牌。 动态SQL错误。 SQL错误代码=-104。 令牌未知-第3行第8列。 选择 要在数据库中查找多个数据,最好的选择是子查询,例如:注意,我假设您正在查找某种类型的重复行 从tBoss中选择id,其中,按count*>1的id从tBoss组中选择id中的id 其中id是可能重复的列您的数据库是否有触发器?如果是这

我想限制表中的条目。让我们假设在表tBoss中。是否存在检查表中当前有多少元组的SQL约束?像

SELECT COUNT(*) from tBoss < 2
火鸟说:

无效令牌。 动态SQL错误。 SQL错误代码=-104。 令牌未知-第3行第8列。 选择


要在数据库中查找多个数据,最好的选择是子查询,例如:注意,我假设您正在查找某种类型的重复行

从tBoss中选择id,其中,按count*>1的id从tBoss组中选择id中的id


其中id是可能重复的列

您的数据库是否有触发器?如果是这样,请添加一个触发器,该触发器回滚将添加超过2行的任何插入

Create Trigger MyTrigName
For Insert On tBoss
As
    If (Select Count(*) From tBoss) > 2
       RollBack Transaction
但要直接回答您的问题,您需要的谓词只是将select子查询放在括号内。像这样

  [First part of sql statement ]
  Where (SELECT COUNT(*) from tBoss) < 2

可以使用检查约束和标量函数来实现这一点。下面是我如何构建示例的

首先,创建一个表:

CREATE TABLE MyTable
 (
   MyTableId  int           not null  identity(1,1)
  ,MyName     varchar(100)  not null
 )
然后为该表创建一个函数。如果需要更大的灵活性,可以将行计数限制添加为参数

CREATE FUNCTION dbo.MyTableRowCount()
RETURNS int
AS
 BEGIN
    DECLARE @HowMany int

    SELECT @HowMany = count(*)
      from MyTable
    RETURN @HowMany
 END
现在,使用此函数向表中添加检查约束

ALTER TABLE MyTable
 add constraint CK_MyTable__TwoRowsMax
  check (dbo.MyTableRowCount() < 3)
缺点是每次插入表时,都必须运行函数并执行表扫描。。。但是,有聚集索引的表最多占用两页。真正的缺点是它看起来有点傻。。。但当你不明白为什么会这样时,一切看起来都很愚蠢


触发器解决方案可以工作,但我希望尽可能避免使用触发器。

谢谢,但整个表不应包含超过2个条目。那么没有where的解决方案是什么呢?我得到了一个错误。我的思维模式和假设遵循了这篇文章,但问题中没有足够的数据来隔离真正的目标,至少在撰写本文时是这样。根据DB和隔离级别,您不需要锁定表吗?例如,如果已经有一行和两个事务正在插入。我认为,因为每次插入都会在它正在插入的行上放置锁,在触发器完成并允许提交事务之前不会释放锁,所以不需要表锁,但我不确定最后一点。嗨,如何向MyTableRowCount函数添加参数?假设我想在count语句中包含WHERE,这取决于在WHERE约束中检查的内容。我建议将此作为一个单独的SO问题。
ALTER TABLE MyTable
 add constraint CK_MyTable__TwoRowsMax
  check (dbo.MyTableRowCount() < 3)
INSERT MyTable (MyName) values ('Row one')
INSERT MyTable (MyName) values ('Row two')
INSERT MyTable (MyName) values ('Row three')
INSERT MyTable (MyName) values ('Row four')