我正在尝试编写一个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)上添加唯一的索引/约束来防止这种情况的发生。

使用唯一的索引/约束,如果发生冲突,更新之一将失败。

09-27 02:28
查看更多