sql – 一组记录中的唯一约束,其中某些值相同
DBMS:MS Sql Server 2005,标准版
我想创建一个表约束,只有一个记录在表的一个子集中具有特定值(其中行共享特定列中的值).这可能吗? 例: 在摘要中,它看起来像这样: myTable ------------- pk1 (int,not null) name (varchar(50),null) fk1 (int,not null) isPrimary (bit,not null) 对于fk1的每个唯一值,我想确保将isPrimary标志设置为1的唯一一条记录. 数据示例: pk1 name fk1 isPrimary ---- ----- ----- ---------- 1 Bill 111 1 2 Tom 111 0 3 Dick 222 1 4 Harry 222 0 但这不应该是(超过一个fk = 111): pk1 name fk1 isPrimary ---- ----- ----- ---------- 1 Bill 111 1 2 Tom 111 1 3 Dick 222 1 4 Harry 222 0 这也不应该(没有fk = 222): pk1 name fk1 isPrimary ---- ----- ----- ---------- 1 Bill 111 1 2 Tom 111 0 3 Dick 222 0 4 Harry 222 0 有没有办法用表约束来做到这一点? UPDATE CREATE FUNCTION [dbo].[OneIsPrimaryPerFK1](@fk1 INT,@dummyIsPrimary BIT) RETURNS INT AS BEGIN DECLARE @retval INT; DECLARE @primarySum INT; SET @retval = 0; DECLARE @TempTable TABLE ( fk1 INT,PrimarySum INT) INSERT INTO @TempTable SELECT fk1,SUM(CAST(isPrimary AS INT)) AS PrimarySum FROM FacAdmin WHERE fk1 = @fk1 GROUP BY fk1; SELECT @primarySum = PrimarySum FROM @TempTable; IF(@primarySum=1) BEGIN SET @retval = 1 END RETURN @retval END; 变化: >使用@tempTable而不是 根据udf的要求,tempTable(在内存中,写入磁盘) 解决方法在检查约束中使用UDF可能会在 snapshot isolation或 multirow updates下失败.假设您的所有fk1和pk1值当前(并且将始终为)为正,您可以使用以下定义创建计算列 CASE WHEN isPrimary = 1 THEN fk1 ELSE -pk1 END 然后添加一个唯一的约束.或者,如果不能做出那个假设那么可能 CASE WHEN isPrimary = 0 THEN 1.0/pk1 ELSE fk1 END (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |