寻找SQL约束:从tBoss <2中选择COUNT(*)

Nor*_*ert 0 sql constraints count

我想限制表格中的条目.让我们在表tBoss中说.是否有SQL约束检查表中当前有多少元组?喜欢

SELECT COUNT(*) from tBoss < 2
Run Code Online (Sandbox Code Playgroud)

火鸟说:

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

谢谢.诺伯特

Cha*_*ana 5

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

Create Trigger MyTrigName
For Insert On tBoss
As
    If (Select Count(*) From tBoss) > 2
       RollBack Transaction
Run Code Online (Sandbox Code Playgroud)

但要直接回答你的问题,你想要的谓词只是将select子查询放在括号内.像这样 ...

  [First part of sql statement ]
  Where (SELECT COUNT(*) from tBoss) < 2
Run Code Online (Sandbox Code Playgroud)


Phi*_*ley 5

您可以使用检查约束和标量函数来执行此操作.这是我如何构建一个样本.

首先,创建一个表:

CREATE TABLE MyTable
 (
   MyTableId  int           not null  identity(1,1)
  ,MyName     varchar(100)  not null
 )
Run Code Online (Sandbox Code Playgroud)

然后为该表创建一个函数.(如果您想要更灵活,可以将行数限制添加为参数.)

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

    SELECT @HowMany = count(*)
      from MyTable
    RETURN @HowMany
 END
Run Code Online (Sandbox Code Playgroud)

现在使用此函数向表中添加检查约束

ALTER TABLE MyTable
 add constraint CK_MyTable__TwoRowsMax
  check (dbo.MyTableRowCount() < 3)
Run Code Online (Sandbox Code Playgroud)

并测试它:

INSERT MyTable (MyName) values ('Row one')
INSERT MyTable (MyName) values ('Row two')
INSERT MyTable (MyName) values ('Row three')
INSERT MyTable (MyName) values ('Row four')
Run Code Online (Sandbox Code Playgroud)

缺点是每次插入表时,都必须运行该函数并执行表扫描......但是,表(具有聚簇索引)最多占用两页.真正的缺点是它看起来有点傻...但是当你不明白为什么它必须那样时,一切看起来都很傻.

(触发器解决方案可行,但我希望尽可能避免触发器.)