【问题标题】:Insert new record with composite primary key, which consists of two foreign keys from different tables插入具有复合主键的新记录,它由来自不同表的两个外键组成
【发布时间】:2016-04-28 12:48:08
【问题描述】:

请帮我弄清楚如何使用复合主键插入新记录,复合主键由来自不同表的两个外键组成。 如果这很重要,我正在使用 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 是 Sales 表中记录的最后一个 ID,而 ItemSKU 等于我从另一个窗口获得的值。

我想要这些值:

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

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

【问题讨论】:

    标签: sql-server sql-server-2012 ssms sqlcommand


    【解决方案1】:

    首先,您需要从 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;
    

    要了解有关子查询的更多信息,请参阅 Itzik Ben-Gan 的 Microsoft SQL Server 2012 T-SQL Fundamentals,第 4 章:子查询。

    【讨论】:

      猜你喜欢
      • 2016-10-23
      • 2018-05-24
      • 2019-05-25
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 2017-06-14
      相关资源
      最近更新 更多