Sql server MSSQL-如果其他列不等于引用行,则为同一列的外键

Sql server MSSQL-如果其他列不等于引用行,则为同一列的外键,sql-server,database-design,foreign-keys,constraints,Sql Server,Database Design,Foreign Keys,Constraints,我有一个数据库,其中有两个表: CREATE TABLE Transactions ( ID BIGINT IDENTITY(1,1) NOT NULL, AccountID BIGINT NOT NULL, Amount BIGINT NOT NULL, CONSTRAINT PK_Transactions PRIMARY KEY CLUSTERED (ID ASC,AccountID ASC), CONSTRAINT FK_Transaction_Ac

我有一个数据库,其中有两个表:

CREATE TABLE Transactions (
    ID BIGINT IDENTITY(1,1) NOT NULL,
    AccountID BIGINT NOT NULL,
    Amount BIGINT NOT NULL,
    CONSTRAINT PK_Transactions PRIMARY KEY CLUSTERED (ID ASC,AccountID ASC),
    CONSTRAINT FK_Transaction_Account FOREIGN KEY (AccountID) REFERENCES Accounts(ID)
);
CREATE TABLE Accounts (
    ID BIGINT IDENTITY(1,11) NOT NULL,
    Balance BIGINT NOT NULL,
    CONSTRAINT PK_Accounts PRIMARY KEY (ID)
);
通过我编写的存储过程将事务插入到它们的表中,这样当帐户1将25个“硬币”转移到帐户21时,会生成两行:

 ID | AccountID | Amount
-------------------------
 1  | 1         | -25
-------------------------
 1  | 21        | 25
在上面的模式中,我希望第一行根据ID引用底层行,AccountID与底层行的AccountID不相等。
维卡也一样

我想做的事情如下所示:

CONSTRAINT FK_Transaction_Counterpart FOREIGN KEY (ID) REFERENCES Transactions(ID) WHERE thisRow.AccountID != referencedRow.AccountID
我在表格约束的文档中没有发现这种可能性。
所以出于好奇和意图,我问,这可能吗?如果是,怎么做

编辑: 答案表明这是不可能的,我应该调整我的设计或意图。

我想我可以在功能代码中将两个事务行相互分配。

传统的外键不能是有条件的(即附加了no WHERE子句)。在您的情况下,我可能只需要确保插入是原子的(在同一事务中),这样就不可能只插入其中一个

传统外键不能是有条件的(即附加了no WHERE子句)。在您的情况下,我可能只需要确保插入是原子的(在同一事务中),这样就不可能只插入其中一个

如果您尝试实现的数据模型是:

  • 一个事务(ID)在表事务中有两个且只有两个条目
  • 对于给定事务ID的两行,AccountID不能相同
然后,在数据库表结构中实施此业务规则的一种可能过于复杂的方法如下:

科目
,如您所定义

事务
,如您所定义

新表
TransactionPair
带有:

列(所有列均不为空)

  • 身份证

  • 低帐户ID

  • 高帐户ID

约束条件

  • ID上的主键(每个事务ID只有一个条目)
  • 将(ID,LowAccountID)上的外键输入到事务中
  • 将(ID,HighAccountID)上的外键输入到事务中
  • 检查行上的约束,以便
    lowcountid
过程:

  • 将一对行添加到事务表
  • 将单行添加到引用刚才添加的行的TransactionPair
  • 如果无法添加该行,或者出现故障,请回滚所有内容

看起来整洁,但很可能过于复杂。您的里程数可能会有所不同。

如果您尝试实施的数据模型是:

  • 一个事务(ID)在表事务中有两个且只有两个条目
  • 对于给定事务ID的两行,AccountID不能相同
然后,在数据库表结构中实施此业务规则的一种可能过于复杂的方法如下:

科目
,如您所定义

事务
,如您所定义

新表
TransactionPair
带有:

列(所有列均不为空)

  • 身份证

  • 低帐户ID

  • 高帐户ID

约束条件

  • ID上的主键(每个事务ID只有一个条目)
  • 将(ID,LowAccountID)上的外键输入到事务中
  • 将(ID,HighAccountID)上的外键输入到事务中
  • 检查行上的约束,以便
    lowcountid
过程:

  • 将一对行添加到事务表
  • 将单行添加到引用刚才添加的行的TransactionPair
  • 如果无法添加该行,或者出现故障,请回滚所有内容
看起来整洁,但很可能过于复杂。您的里程可能会有所不同