查找SQL约束:从tBoss1的id从tBoss组中选择id中的id
我想限制表中的条目。让我们假设在表tBoss中。是否存在检查表中当前有多少元组的SQL约束?像查找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是可能重复的列您的数据库是否有触发器?如果是这
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')