首页 > 解决方案 > 尝试使用 3 个主键更新行不起作用

问题描述

我有一个表,其中一行有 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

标签: sqlsql-servertsql

解决方案


你的问题是你并没有真正调用 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

推荐阅读