寻找SQL约束:来自tBoss的SELECT COUNT(*)< 2
-
06-07-2019 - |
题
我想限制表格中的条目。我们在表 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
不隶属于 StackOverflow