在 SQLite 3 的另一个 table 中删除行和引用行
Delete row and referencing rows in another table in SQLite 3
我正在使用 SQLite 来尝试和学习更多 SQL。我有一个像这样填充的 SQLite 3 数据库:
create table playlist (id integer primary key autoincrement, name text);
create table playlistitem (id integer primary key autoincrement,
playlist_id integer, name text);
insert into playlist (name) values ("Moss");
insert into playlist (name) values ("Jen");
insert into playlistitem (playlist_id, name) values (1, "Roy");
insert into playlistitem (playlist_id, name) values (1, "Richmond");
insert into playlistitem (playlist_id, name) values (2, "Denholm");
太好了,现在 "Moss"
播放列表中有两个播放列表项目,"Roy"
和 "Richmond"
;我在 "Jen"
播放列表中有一项:"Denholm"
.
我想做的是通过一次查询删除 "Moss"
播放列表及其所有项目。
我看到了这样的东西,但对我来说失败了:
delete playlist, playlistitem from playlist
inner join playlistitem on playlistitem.playlist_id = playlist.id
where playlist.name = "Moss";
失败:
Error: near "playlist": syntax error
我做错了什么?
sqlite 在 delete
语句中不支持 join
。您必须使用单独的查询,根据 playlist_id
从第二个 table 中删除,在 playlist
上触发删除,或者使用 on delete cascade
:[= 使该引用成为外键18=]
create table playlistitem (
id integer primary key autoincrement,
playlist_id integer, name text,
foreign key(playlist_id) references playlist(id) on delete cascade);
然后只使用 delete from playlist where name='Moss'
.
不要忘记启用外键 - pragma foreign_keys=1
(您必须在每个 sqlite 连接上重新启用它,例如作为连接后的第一个命令)。
我正在使用 SQLite 来尝试和学习更多 SQL。我有一个像这样填充的 SQLite 3 数据库:
create table playlist (id integer primary key autoincrement, name text);
create table playlistitem (id integer primary key autoincrement,
playlist_id integer, name text);
insert into playlist (name) values ("Moss");
insert into playlist (name) values ("Jen");
insert into playlistitem (playlist_id, name) values (1, "Roy");
insert into playlistitem (playlist_id, name) values (1, "Richmond");
insert into playlistitem (playlist_id, name) values (2, "Denholm");
太好了,现在 "Moss"
播放列表中有两个播放列表项目,"Roy"
和 "Richmond"
;我在 "Jen"
播放列表中有一项:"Denholm"
.
我想做的是通过一次查询删除 "Moss"
播放列表及其所有项目。
我看到了这样的东西,但对我来说失败了:
delete playlist, playlistitem from playlist
inner join playlistitem on playlistitem.playlist_id = playlist.id
where playlist.name = "Moss";
失败:
Error: near "playlist": syntax error
我做错了什么?
sqlite 在 delete
语句中不支持 join
。您必须使用单独的查询,根据 playlist_id
从第二个 table 中删除,在 playlist
上触发删除,或者使用 on delete cascade
:[= 使该引用成为外键18=]
create table playlistitem (
id integer primary key autoincrement,
playlist_id integer, name text,
foreign key(playlist_id) references playlist(id) on delete cascade);
然后只使用 delete from playlist where name='Moss'
.
不要忘记启用外键 - pragma foreign_keys=1
(您必须在每个 sqlite 连接上重新启用它,例如作为连接后的第一个命令)。