sql - 尝试使用 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
解决方案
你的问题是你并没有真正调用 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
推荐阅读
- python - 如何使熊猫数据框保持不变并在函数之外使用它?
- javascript - 如何修复警告:validateDOMNesting(...):不能作为孩子出现
- flutter - flutter_local_notifications:“PlatformException(PlatformException(INVALID_ICON,找不到资源))
- pytorch - 修复torch random_split() 的种子
- python - ValueError:无法反序列化关键数据
- c++ - 误导性语法/解析器错误:reinterpret_cast 中预期 > 而不是 *
- python - 引用 main() 的 Python 容器问题
- java - 将特殊字符转换为字节和字符串的问题
- google-colaboratory - 如何在 Colab 中获取内核的控制台输出
- javascript - 在 Javascript 中创建可重用的类型编写器效果函数?