【问题标题】:Trying to update row with 3 primary keys doesn't work尝试使用 3 个主键更新行不起作用
【发布时间】:2019-04-16 21:46:44
【问题描述】:

我有一个表,其中一行有 3 个主键,每当我尝试更新此行时,我都会得到“无法插入重复值”,但我尝试使用 UPDATE 命令而不是 INSERT 更新该行?

CREATE TABLE dbo.TestData
(
    OgrId int NOT NULL,
    StrId int NOT NULL,
    UserId int NOT NULL,
    ProductId int NOT NULL,
    CONSTRAINT PK_OgrId_StrId_UserId
        PRIMARY KEY(OgrId, StrId, UserId)
)

DECLARE @ogrId int = 99;
DECLARE @strId int = 44;
DECLARE @userId int = 1223;
DECLARE @id int = 14;

DECLARE @querySelect int = 
    (SELECT ProductId FROM dbo.TestData
        WHERE
            OgrId = @ogrId AND 
            StrId = @strId AND 
            UserId = @userId AND
            ProductId= @id);
IF @querySelect IS NULL
    BEGIN
        INSERT INTO dbo.TestData(OgrId, StrId, UserId, ProductId)
        VALUES (@ogrId , @strId , @userId, @id);
    END
ELSE
    BEGIN
        UPDATE dbo.TestData
        SET ProductId= @id
        WHERE 
            OgrId = @ogrId AND 
            StrId = @strId AND 
            UserId = @userId;
    END

【问题讨论】:

  • 你不能有“3个主键”,主键只能是一个。你所拥有的是由 3 个关键字段组成的 PK
  • >>>我正在尝试使用 UPDATE 更新该行INSERT INTO dbo.TestData(OgrId, StrId, UserId, ProductId) VALUES (@ogrId , @strId , @userId, @id);
  • 还有 if 语句选择更新或插入...我可以有 3 个主键,这就是重点!
  • 没有什么可以帮助拥有“3个主键”的人
  • 我已经修复了,谢谢回复:)

标签: sql sql-server tsql


【解决方案1】:

你的问题是你并没有真正调用 UPDATE 而是 INSERT,它试图创建一个重复的键。

这是因为您正在检查主键值和产品 ID 是否存在一行。当您尝试将同一行更改为不同的产品 ID 时,您的支票将返回 false。

我对您的代码稍作更改,因此您仅检查当前产品 id 的主键值,仅在不存在时插入它,仅在它不同时更新它。

CREATE TABLE dbo.TestData
(
    OgrId int NOT NULL,
    StrId int NOT NULL,
    UserId int NOT NULL,
    ProductId int NOT NULL,
    CONSTRAINT PK_OgrId_StrId_UserId
        PRIMARY KEY(OgrId, StrId, UserId)
)

DECLARE @ogrId int = 99;
DECLARE @strId int = 44;
DECLARE @userId int = 1223;
DECLARE @id int = 14;

DECLARE @querySelect int = 
    (SELECT ProductId FROM dbo.TestData
        WHERE
            OgrId = @ogrId AND 
            StrId = @strId AND 
            UserId = @userId);

IF @querySelect IS NULL
    BEGIN
        INSERT INTO dbo.TestData(OgrId, StrId, UserId, ProductId)
        VALUES (@ogrId , @strId , @userId, @id);
    END
ELSE IF @querySelect <> @id
    BEGIN
        UPDATE dbo.TestData
        SET ProductId= @id
        WHERE 
            OgrId = @ogrId AND 
            StrId = @strId AND 
            UserId = @userId;
    END

【讨论】:

    猜你喜欢
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多