Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 使用另一个表中某列的值约束表中的值_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

Sql 使用另一个表中某列的值约束表中的值

Sql 使用另一个表中某列的值约束表中的值,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,所以我有两张桌子: Requests -------- Id RequestSchemeId ReceivedByUserId ForwardedRequests ----------------- Id RequestId (FK to Id column of Requests Table) ForwardedToUserId 现在有一条业务规则规定,对于特定的RequestScheme,用户只能收到一个请求。因此,我为RequestSchemeId+ReceivedByUserId创建

所以我有两张桌子:

Requests
--------
Id
RequestSchemeId
ReceivedByUserId

ForwardedRequests
-----------------
Id
RequestId (FK to Id column of Requests Table)
ForwardedToUserId
现在有一条业务规则规定,对于特定的RequestScheme,用户只能收到一个请求。因此,我为RequestSchemeId+ReceivedByUserId创建了一个UniqueKey约束。哪个能解决我的问题

第二个业务规则是,只有在转发的用户没有来自任何其他用户的同一方案下的转发请求时,才能将请求转发给另一个用户

我能想到的解决方案是ForwardedRequests表中的RequestSchemeId列,它只是Requests表相关行中值的副本,然后在ForwardedTouseId+RequestSchemeId上添加唯一约束

这是正确的做法吗?如果不是,是什么


在ForwardedRequests中创建新行时,如何从ForwardedRequests的请求中获取RequestSchemeId的值?UDF是我看过的东西,但它似乎有一些缺陷,我需要的是标准/推荐的方法,而不是一些古怪的东西

您可以在视图上使用唯一索引来强制执行此约束。下面的例子

CREATE TABLE dbo.Requests 
  ( 
     Id               INT PRIMARY KEY, 
     RequestSchemeId  INT, 
     ReceivedByUserId INT, 
     UNIQUE (RequestSchemeId, ReceivedByUserId) 
  ) 

CREATE TABLE dbo.ForwardedRequests 
  ( 
     Id                INT PRIMARY KEY, 
     RequestId         INT REFERENCES Requests(Id), 
     ForwardedToUserId INT 
  ) 

GO 

CREATE VIEW dbo.ForwardedUserRequestSchemes 
WITH SCHEMABINDING 
AS 
  SELECT ForwardedToUserId, 
         RequestSchemeId 
  FROM   dbo.ForwardedRequests FR 
         JOIN dbo.Requests R 
           ON R.Id = FR.RequestId 

GO 

CREATE UNIQUE CLUSTERED INDEX ix 
  ON dbo.ForwardedUserRequestSchemes(ForwardedToUserId, RequestSchemeId) 

ForwardedRequests是否对未转发的请求具有任何附加属性(除了
ForwardedTouseId
列之外?)还有为什么
ForwardedRequests
具有
Id
列而不是PK为
RequestId
?什么版本的SQL Server?“ForwardedRequests是否对未转发的请求具有其他属性?”是。“ForwardedRequests为什么有Id?”同一请求可以转发给多个用户。SQL 2008只是为了避免混淆。桌子上的东西比问题中的要多得多。甚至表名也不同。我只是简化了它来解释问题并消除噪音。这非常有效!我是否可以“以某种方式”向视图添加一个约束,该约束表示ReceivedByUserId!=转发的Touserid?我不需要一个样本,我想我现在了解了一般的观点,只是方法而已。视图中似乎不允许约束。@NVM-是的。无法向视图添加约束,因此不是一种“干净”的扩展方式。您可以通过向视图中添加一个额外的列
,1/(ForwardedToUserId-ReceivedByUserId)作为FailIfSame来防止添加此类记录,如果两个值相同,则会引发
除以零的错误异常。Heh。那真的很难看。谢谢。@NVM-想到了另一种方法,也不会赢得任何选美比赛!