SQL Server:检查每个用户的重复外键(给定合成主键)
我有一个表,其中主键只是一个合成键,用于跟踪每个用户的跟踪订单。用户不能有重复的订单,但可以根据需要跟踪任意多个不同的订单。我的问题是,我想通过将当前解决方案(检查查询中的重复项)更改为检查约束或类似的方式来提高性能 桌子 在这种情况下,是否可以创建一个检查约束来防止向表中插入数据 为了澄清这一点,我是否可以在数据库模式中添加代码以进行检查,而不必在我的应用程序的SQL代码中添加检查已存在记录的过程,这样,如果没有通过检查约束,它就会抛出一个错误 e、 g 而不是:SQL Server:检查每个用户的重复外键(给定合成主键),sql,sql-server,Sql,Sql Server,我有一个表,其中主键只是一个合成键,用于跟踪每个用户的跟踪订单。用户不能有重复的订单,但可以根据需要跟踪任意多个不同的订单。我的问题是,我想通过将当前解决方案(检查查询中的重复项)更改为检查约束或类似的方式来提高性能 桌子 在这种情况下,是否可以创建一个检查约束来防止向表中插入数据 为了澄清这一点,我是否可以在数据库模式中添加代码以进行检查,而不必在我的应用程序的SQL代码中添加检查已存在记录的过程,这样,如果没有通过检查约束,它就会抛出一个错误 e、 g 而不是: DECLARE @userI
DECLARE @userId INT
DECLARE @orderId INT
IF (SELECT COUNT(*)
FROM Tracking
WHERE UserId = @userId AND OrderId = @orderId
GROUP BY UserId, OrderId
HAVING COUNT(*) > 0) > 0
-- Check failed (User already has a record for that particular OrderId, can't add it again)
THROW 51000, 'Cannot insert duplicate order for user.', 1;
ELSE
(
INSERT INTO Tracking
...
)
您似乎想要唯一的约束,而不是检查约束:
alter table tracking
add constraint unq_tracking_userid_orderid unique (userid, orderid);
您似乎想要唯一的约束,而不是检查约束:
alter table tracking
add constraint unq_tracking_userid_orderid unique (userid, orderid);
您可以在此处看到唯一约束/索引的概念: 在您的情况下,代码应为:
CREATE UNIQUE INDEX ix_tracking_userid_orderid ON tracking (userid, orderid);
您可以在此处看到唯一约束/索引的概念: 在您的情况下,代码应为:
CREATE UNIQUE INDEX ix_tracking_userid_orderid ON tracking (userid, orderid);
为什么不在这两列上添加一个唯一的约束呢?检查约束通常只限于给定行中的值,因此使用它跨多行检查的想法与此目的相矛盾。简短的回答是否定的-答案不再是肯定的(伴随着复杂情况)。如前所述,更好的答案是一个独特的约束条件。顺便说一句,将逻辑转移到“提高性能”的想法是没有意义的。这是一个吗?为什么不在两列上添加一个唯一的约束呢?检查约束通常限于给定行内的值-因此使用它跨多行检查的想法与此目的相矛盾。简短的回答是否定的-答案不再是肯定的(伴随着复杂情况)。如前所述,更好的答案是一个独特的约束条件。顺便说一句,将逻辑转移到“提高性能”的想法是没有意义的。这是一个吗?如果我创建了这个唯一的约束,我是否能够将更多的OrderId添加到另一个UserId下的表中?@MattD。您可以向每个用户ID添加一行OrderId。如果我创建此唯一约束,是否可以将更多该OrderId添加到其他用户ID下的表中?@MattD。您可以向每个UserId添加一行OrderId。