插入具有复合主键的新记录,它由来自不同表的两个外键组成

Insert new record with composite primary key, which consists of two foreign keys from different tables

请帮我弄清楚如何使用复合主键插入新记录,复合主键由来自不同 table 的两个外键组成。 如果重要的话,我在 C# 和 WPF 中工作。

我有三个 table: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 table(第三个)中插入一条新记录,其中 saleID 是 Sales table 中记录的最后一个 ID,ItemSKU 等于我从另一个获得的值window。

我想要这些值:

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

我想我必须在一个查询中完成,但我不知道如何做。 你能给我一个提示吗?我

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

上需要

您可以像这样执行单个 INSERT 语句。它使用两个子查询,即括号中的 SELECT 语句,从其他两个 table 中获取值。

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;

要阅读有关子查询的更多信息,请参阅 Microsoft SQL Server 2012 T-SQL Itzik Ben-Gan 的基础知识,第 4 章:子查询。