Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:检查每个用户的重复外键(给定合成主键)_Sql_Sql Server - Fatal编程技术网

SQL Server:检查每个用户的重复外键(给定合成主键)

SQL Server:检查每个用户的重复外键(给定合成主键),sql,sql-server,Sql,Sql Server,我有一个表,其中主键只是一个合成键,用于跟踪每个用户的跟踪订单。用户不能有重复的订单,但可以根据需要跟踪任意多个不同的订单。我的问题是,我想通过将当前解决方案(检查查询中的重复项)更改为检查约束或类似的方式来提高性能 桌子 在这种情况下,是否可以创建一个检查约束来防止向表中插入数据 为了澄清这一点,我是否可以在数据库模式中添加代码以进行检查,而不必在我的应用程序的SQL代码中添加检查已存在记录的过程,这样,如果没有通过检查约束,它就会抛出一个错误 e、 g 而不是: DECLARE @userI

我有一个表,其中主键只是一个合成键,用于跟踪每个用户的跟踪订单。用户不能有重复的订单,但可以根据需要跟踪任意多个不同的订单。我的问题是,我想通过将当前解决方案(检查查询中的重复项)更改为检查约束或类似的方式来提高性能

桌子

在这种情况下,是否可以创建一个检查约束来防止向表中插入数据

为了澄清这一点,我是否可以在数据库模式中添加代码以进行检查,而不必在我的应用程序的SQL代码中添加检查已存在记录的过程,这样,如果没有通过检查约束,它就会抛出一个错误

e、 g

而不是:

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。