sql - 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 已经生锈了……
解决方案
上面发布的查询按预期工作;这是我的错误所在:我错过了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