sqlite - 如何在 SQLite 中删除具有 2 列作为复合主键的多行?

标签 sqlite delete-row composite-primary-key sql-delete

我需要删除 SQLite 表中的一些行,其中两列作为主键,如下所示:

DELETE FROM apt_lang 
WHERE (apt_fk, apt_lang_fk) NOT IN ((42122,"en"),(42123,"es"),(42123,"en"))

这适用于 Oracle 和 MySQL,但不适用于 SQLite。

谁能帮帮我?

最佳答案

首先,找出要删除的行。 最简单的方法是使用连接:

SELECT *
FROM apt_lang
JOIN (SELECT 42122 AS apt_fk, 'en' AS apt_lang_fk UNION ALL
      SELECT 42123          , 'es'                UNION ALL
      SELECT 42123          , 'en'                         )
USING (apt_fk, apt_lang_fk)

要将其与 DELTE 一起使用,请检查 EXISTS 是否匹配:

DELETE FROM apt_lang
WHERE NOT EXISTS (SELECT 1
                  FROM apt_lang AS a2
                  JOIN (SELECT 42122 AS apt_fk, 'en' AS apt_lang_fk UNION ALL
                        SELECT 42123          , 'es'                UNION ALL
                        SELECT 42123          , 'en'                         )
                  USING (apt_fk, apt_lang_fk)
                  WHERE apt_fk      = apt_lang.apt_fk
                    AND apt_lang_fk = apt_lang.apt_lang_fk)

或获取 ROWID子查询的 s 并检查那些:

DELETE FROM apt_lang
WHERE rowid NOT IN (SELECT apt_lang.rowid
                    FROM apt_lang
                    JOIN (SELECT 42122 AS apt_fk, 'en' AS apt_lang_fk UNION ALL
                          SELECT 42123          , 'es'                UNION ALL
                          SELECT 42123          , 'en'                         )
                    USING (apt_fk, apt_lang_fk))

关于sqlite - 如何在 SQLite 中删除具有 2 列作为复合主键的多行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29073838/

相关文章:

java - 在 java 中,如何删除 sqlite 表?

android - 我了解如何将 .csv 文件导入 sqlite 吗?

mysql - 删除mysql中的随机数据

ios - TableView deleteRowsAtIndexPaths :withRowAnimation Very Slow

java - hibernate中composite-id复杂映射

mysql - 在这种情况下,自然键和复合键哪个更好

java - 如何更改 getWritableDatabase() 指向路径?

mysql - 序列化涉及 "last inserted row id"的特殊查询

ios - 动画不适用于 UITableView deleteRowsAtIndexPaths :withRowAnimation:

mysql - hibernate 不插入行