SQLite UPDATE ID удаляет строку - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь обновить значения в строке таблицы и дать этой строке следующий последовательный идентификатор (я не тот, кто решил это, но факт: когда я меняю заголовок, мне нужен новый идентификатор).

Например:

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

Должно стать

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

Я попытался обновить заголовок, оставив идентификатор прежним. Этот запрос работает безупречно:

result = await database_helper.dbRunQuery(`
    UPDATE Songs 
    SET Title=?,
        LastModified=? 
    WHERE Id=?`, [
        newValue,
        new Date(),
        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

для выбора самого высокого идентификатора в таблице, я должен просто иметь возможность поместить это в подзапрос, как Update Songs Set ..., Id=(SELECT Id ... LIMIT 1) WHERE ... верно? Мой SQL стал довольно ржавым, я должен признать ...

1 Ответ

0 голосов
/ 04 марта 2020

Отправленный выше запрос работает как положено; Вот где моя ошибка: я пропустил первый 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

, который тогда не показывал идентификатор новой песни, потому что она не могла быть присоединена - вот исправленная версия :

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...