同时更新两个表T-SQL

时间:2018-03-21 16:29:40

标签: sql-server tsql cascade

我创建了一个名为Sales_Details_Store1的表和一个名为Sales_Store1的第二个表。

使用RI将Sale_ID(bigint类型的增量1,1)作为Sales_Store1表中的PK并且FK为Sale_ID(bigint) Sales_Details_Store1表。

在两个表之间声明RI时,我使用了ON DELETE CASCADEON UPDATE CASCADE

我正在努力解决的问题是我需要使用PK中增加的值更新我的FK,但能够同时更新两个表记录。

我在整理触发器或事务时遇到了麻烦。有什么建议吗?

Sales_Store1
Sale_ID (PK, icrement(1,1), bigint, not null), 
Employee_ID (bigint, null), 
Customer_ID (bigint, null), 
Sale_Date (datetime, null), 
Taxes (money, null), 
Payment_Type (varchar, null), 
Notes (varchar, null), 
Tax_Rate (decimal, null), 
Tax_Status (int, null) 

Sales_Details_Store1
ID (PK, bigint, not null), 
Sale_ID (FK, bigint, null), 
Product_ID (bigint, null), 
Quantity (int, null), 
Unit_Price (decimal, null), 
Discount (decimal, null),
Date_Allocated (datetime, null),
Inventory_ID (bigint, null)

1 个答案:

答案 0 :(得分:0)

这对我来说听起来不像是一个级联问题。听起来更像是,当您插入第二个表时,您需要第一个表中的标识值。

在事务内部,您应该插入Sales_Store1,然后获取ID(通过Scope_Identity()或使用OUTPUT语句),然后将数据插入Sales_Details_Store1,提供主键你已经完成了前一步。

示例:

CREATE TABLE Sale (SaleID BIGINT IDENTITY(1,1) NOT NULL,SaleDate DATETIME2)
CREATE TABLE SaleDetail (SaleDetailID BIGINT IDENTITY(1,1) NOT NULL,SaleID BIGINT,ItemDesc NVARCHAR(200))
GO


BEGIN TRAN t1;
INSERT INTO Sale(SaleDate) SELECT GETDATE();
DECLARE @SaleID BIGINT=SCOPE_IDENTITY();
INSERT INTO SaleDetail (SaleID,ItemDesc) SELECT @SaleID,'Test'
COMMIT TRAN t1;
--ROLLBACK TRAN t1;
GO

SELECT * FROM Sale
SELECT * FROM SaleDetail
GO