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

SELECT COUNT(*) from tBoss < 2

Firebird说:

  

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

感谢。诺贝特

有帮助吗?

解决方案

您的数据库是否有触发器?如果是这样,添加一个触发器,回滚任何可以添加超过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)

测试一下:

INSERT MyTable (MyName) values ('Row one')
INSERT MyTable (MyName) values ('Row two')
INSERT MyTable (MyName) values ('Row three')
INSERT MyTable (MyName) values ('Row four')

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

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

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

  

SELECT id FROM tBoss WHERE id IN(SELECT id FROM tBoss GROUP BY id HAVING count(*)&gt; 1)

其中id是可能重复的列

SELECT COUNT(*) FROM tBoss WHERE someField < 2 GROUP BY someUniqueField
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top