sqlite - 如何在表中删除后更新某些元组
问题描述
我正在尝试在 SQLite 中对音乐流服务数据库进行建模,并且我想创建这个触发器:当从播放列表中删除一首歌曲时,在它之后出现的每首歌曲都需要减少其位置。我不太确定如何编写此触发器。
这是播放列表表的示例(对不起葡萄牙语名称。idMusica = 歌曲 ID;posicao = 歌曲在播放列表中的位置)
为了进一步解释我想要的例子:如果我从播放列表 1 中删除歌曲 6,歌曲 11 的位置将变为 3。
解决方案
我相信以下内容会如您所愿:-
CREATE TRIGGER IF NOT EXISTS playlistreorder
AFTER DELETE ON playlist
BEGIN
UPDATE playlist SET posicao = posicao -1 WHERE posicao > old.posicao AND idPlayList = old.idPlayList;
END
;
- 请注意,表名称已假定为播放列表
例子
考虑以下测试:-
DROP TABLE IF EXISTS playlist;
CREATE TABLE IF NOT EXISTS playlist (idMusica INTEGER, idPlayList INTEGER, posicao INTEGER);
INSERT INTO playlist (idMusica,idPlayList, posicao) VALUES
(12,1,1),(5,1,2),(6,1,3),(11,1,4),
(1,2,1),(2,2,2),(3,2,2),(4,2,4),(9,2,5)
;
CREATE TRIGGER IF NOT EXISTS playlistreorder
AFTER DELETE ON playlist
BEGIN
UPDATE playlist SET posicao = posicao -1 WHERE posicao > old.posicao AND idPlayList = old.idPlayList;
END
;
SELECT * FROM playlist;
DELETE FROM playlist WHERE posicao = 3 AND idplayList = 1;
SELECT * FROM playlist;
示例结果
重新排序之前(第一次查询):-
重新排序后(第二次查询):-
推荐阅读
- angular - SPA 中的大量 Web API 调用
- ios - “无法识别的选择器已发送到实例”,用于为表视图实现拉取刷新的扩展
- c++ - 构造函数干扰成员变量指定的初始化程序?
- reactjs - Jest 遇到了意外的令牌 (html)
- gradle - 在 Gradle 构建中使用 Ant taskdef 和 loaderref
- azure - 通过 REST 对 AAD 企业应用程序进行 Azure AD 身份验证
- shell - 带有 Chocolatey 安装和在步骤之间重新启动的 Windows 脚本
- cloud - 无法启动 PCF Dev 实例
- asp.net-core - 是否可以在不使用 OWIN 的情况下使用 IdentityModel 将 .net 4.5 中的 webform 应用程序与 IdentityServer4 集成?
- html - 带有 CSS 动画悬空键的响应式图像,应保持响应式原位