首页 > 解决方案 > SQLite UPDATE ID 删除行

问题描述

我正在尝试更新表行中的值并为该行提供下一个连续 ID(我不是决定这一点的人,但事实是:当我更改标题时,我需要一个新 ID)。

例如:

Id | Title
------------
2  | Wonderwall
3  | Lonely Doy
4  | All That She Wants

应该成为

Id | Title
------------
2  | Wonderwall
4  | All That She Wants
5  | Lonely Day

我尝试在保持 ID 不变的同时更新标题。此查询完美无缺:

result = await database_helper.dbRunQuery(`
    UPDATE Songs 
    SET Title=?,
        LastModified=? 
    WHERE Id=?`, [
        newValue,
        new Date(),
        id
    ]);

但是,当我尝试同时设置 ID 时,该行只会被删除而没有任何错误消息(显然 SQLite 不会在 UPDATE 语句中抛出这些错误消息)。这是不起作用的代码:

result = await database_helper.dbRunQuery(`
    UPDATE Songs 
    SET Title=?,
        LastModified=?,
        Id=?
    WHERE Id=?`, [
        newValue,
        new Date(),
        database_helper.getNextSongID(),
        id
    ]);

这样做有什么原因吗?而且,因为我需要更新更多这样的表:有没有更简单的方法来自动增加 Id 列(不,没有为这个表定义自动增加,我不能改变它)?我已经有查询

SELECT Id
FROM Songs
ORDER BY Id DESC
LIMIT 1

为了选择表中的最高 ID,我应该可以把它放在一个子查询中,就像Update Songs Set ..., Id=(SELECT Id ... LIMIT 1) WHERE ...对吧?我不得不承认,我的 SQL 已经生锈了……

标签: sqlnode.jssqlite

解决方案


上面发布的查询按预期工作;这是我的错误所在:我错过了LEFT此选择查询中的第一个。

SELECT 
Songs.Id as SongID, Songs.Title, Songs.CreationDate, Songs.LastModified, Files.Path, Files.PageOrder, Files.FileSize, Files.Type, Artists.Id as ArtistID, Artists.Name as ArtistName
FROM Songs 
JOIN Files ON Songs.Id = Files.SongId 
LEFT JOIN ArtistsSongs ON Songs.Id = ArtistsSongs.SongId 
LEFT JOIN Artists ON ArtistsSongs.ArtistId=Artists.Id

然后它没有显示新歌曲的 ID,因为它无法加入 - 这是固定版本:

SELECT 
Songs.Id as SongID, Songs.Title, Songs.CreationDate, Songs.LastModified, Files.Path, Files.PageOrder, Files.FileSize, Files.Type, Artists.Id as ArtistID, Artists.Name as ArtistName
FROM Songs 
LEFT JOIN Files ON Songs.Id = Files.SongId 
LEFT JOIN ArtistsSongs ON Songs.Id = ArtistsSongs.SongId 
LEFT JOIN Artists ON ArtistsSongs.ArtistId=Artists.Id

推荐阅读