Попытка обновить строку с 3 первичными ключами не работает - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть таблица с 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

1 Ответ

0 голосов
/ 16 апреля 2019

Ваша проблема в том, что вы на самом деле не вызываете UPDATE, а INSERT, который пытается создать дубликат ключа.

Это потому, что вы проверяете, существует ли строка для значений первичного ключа И ИД продукта. Когда вы пытаетесь изменить ту же строку на другой идентификатор продукта, тогда ваш чек возвращает false.

Я немного изменил ваш код, поэтому вы проверяете текущий идентификатор продукта только для значений первичного ключа, только вставляя его, когда его нет, и обновляя его, только если он другой.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...