我正在尝试编写一个Java sql查询,简化后的表将是对(name, version)
具有唯一约束的table(name,version)。
我正在尝试使用条件语句在数据库中插入一行。这意味着当存在具有相同名称的条目时,它应插入具有相同名称的行,并且其版本增加1。
我尝试了以下方法:
INSERT INTO table(name,version)
VALUES(?, CASE WHEN EXISTS(SELECT name from table where name=?)
THEN (SELECT MAX(version) FROM table WHERE name = ?) +1
ELSE 1 END)
值由用户发送。
我的问题是,如何访问值中的“名称”,以便可以进行比较?
最佳答案
如果要将此作为单个查询编写:
INSERT INTO table (name, version)
SELECT ?, COLAESCE(MAX(t2.version) + 1, 1)
FROM table t2
WHERE t2.name = ?;
也就是说,这很危险。两个线程可以“同时”执行此查询,并可能创建相同的版本号。您可以通过在
(name, version)
上添加唯一的索引/约束来防止这种情况的发生。使用唯一的索引/约束,如果发生冲突,更新之一将失败。