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
- 如果无法添加该行,或者出现故障,请回滚所有内容