2016-04-28 30 views
-1

请帮助我弄清楚如何使用包含来自不同表的两个外键的复合主键插入新记录。 我正在C#中工作,WPF如果有问题。插入带有复合主键的新记录,其中包含来自不同表的两个外键

我有三个表格:Sales,SaleItem,Item。

CREATE TABLE [dbo].[Sales] (
    [saleID]  INT  IDENTITY (1, 1) NOT NULL, 
    [saleTime] DATETIME NOT NULL, 
    [customerID] INT  NULL, 
    [TIN]  INT  NOT NULL, 
    CONSTRAINT [PK_Sales] PRIMARY KEY CLUSTERED ([saleID] ASC), 
    CONSTRAINT [FK_Sales_Customers] FOREIGN KEY ([customerID]) REFERENCES [dbo].[Customers] ([customerID]), 
    CONSTRAINT [FK_Sales_Company] FOREIGN KEY ([TIN]) REFERENCES [dbo].[Company] ([TIN]) 
); 



CREATE TABLE [dbo].[Item] (
    [ItemSKU]  INT   IDENTITY (1, 1) NOT NULL, 
    [itemName] NVARCHAR (50) NOT NULL, 
    [volume]  FLOAT (53) NOT NULL, 
    [measureUnit] NVARCHAR (50) NOT NULL, 
    [producer] NVARCHAR (50) NOT NULL, 
    [supplierID] INT   NOT NULL, 
    [retailPrice] NUMERIC (18) NOT NULL, 
    CONSTRAINT [PK_Item] PRIMARY KEY CLUSTERED ([ItemSKU] ASC), 
    CONSTRAINT [FK_Item_Suppliers] FOREIGN KEY ([supplierID]) REFERENCES [dbo].[Suppliers] ([supplierID]) 
); 

CREATE TABLE [dbo].[SaleItem] (
     [saleID] INT IDENTITY (1, 1) NOT NULL, 
     [itemSKU] INT NOT NULL, 
     [quantity] INT NOT NULL, 
     CONSTRAINT [PK_SaleItem] PRIMARY KEY CLUSTERED ([saleID] ASC, [itemSKU] ASC), 
     CONSTRAINT [FK_SaleItem_Sales] FOREIGN KEY ([saleID]) REFERENCES [dbo].[Sales] ([saleID]), 
     CONSTRAINT [FK_SaleItem_Item] FOREIGN KEY ([itemSKU]) REFERENCES [dbo].[Item] ([ItemSKU]) 
    ); 

我要插入一个新的记录到SaleItem表(第三个),其中saleID被记录在销售表和ItemSKU最后一个ID等于我从另一个窗口中获得的价值。

我想这些值:

SaleID = SELECT TOP 1 saleID FROM Sales ORDER BY saleID DESC"; 
ItemSKU = "SELECT itemName FROM Item WHERE ItemSKU = @sku"; 

我想我必须这样做在一个查询,但我不知道怎么样。 你能给我一个提示吗?我

回答

0

首先,您需要从dbo.SaleItem表中删除IDENTITY属性。仅在父表dbo.Sales上需要IDENTITY属性。

您可以像这样执行单个INSERT语句。它使用两个子查询(它们是括号中的SELECT语句)从另外两个表中获取值。

INSERT INTO dbo.SaleItem (saleID, itemSKU, quantity) 
    VALUES ((SELECT MAX(saleID) FROM dbo.Sales), 
     (SELECT ItemSKU FROM dbo.Item WHERE itemName = N'Widget'), 
     50); 

您可能希望把它变成一个存储过程,就像这样:

CREATE PROCEDURE dbo.up_InsertSaleItem 
(
    @itemName nvarchar(50), 
    @quantity int 
) 
AS 
INSERT INTO dbo.SaleItem (saleID, itemSKU, quantity) 
    VALUES ((SELECT MAX(saleID) FROM dbo.Sales), 
     (SELECT ItemSKU FROM dbo.Item WHERE itemName = @itemName), 
     @quantity); 

然后使用存储过程:

-- Test the stored procedure 
EXEC dbo.up_InsertSaleItem @itemName=N'Widget', @quantity=50; 

SELECT * 
    FROM dbo.SaleItem; 

enter image description here

要阅读更多关于子查询,请参阅Itzik Ben-Gan在“Microsoft SQL Server 2012 T-SQL基础知识”一章中的章节4:子查询。

+0

谢谢!这样可行! –

相关问题