【问题标题】:SQLite: remove all rows except those whose foreign key has a particular valueSQLite:删除除外键具有特定值的行之外的所有行
【发布时间】:2016-03-03 00:46:22
【问题描述】:

我是 SQL 的新手,我有以下问题:

我正在制作一个将 3 个表存储到数据库中的 android 应用程序。

  • 电影,与我称为 Movie 的自定义类相关联

  • Trailers,与我称为 Trailer 的自定义类相关联

  • 评论,与我称为 Review 的自定义类相关联

当应用程序触发事件时,我想创建一个 SQL 语句来删除所有未标记为收藏的电影。此外,它必须删除与未标记为收藏的电影相关的所有预告片和评论。 为了将电影标记为收藏,我添加了一个整数列,它可以有 3 个值:(0,1,2)。当电影条目的值为 2 时,它是收藏夹,因此不得删除。

这是我的表格的结构:

        //SQL statement to create the movies table
    final String SQL_CREATE_FAVOURITES_TABLE = "CREATE TABLE " +
            MoviesEntry.TABLE_NAME + " (" +
            MoviesEntry.COLUMN_MOVIE_ID + " INTEGER PRIMARY KEY," +
            MoviesEntry.COLUMN_POSTER_URL + " TEXT NOT NULL," +
            MoviesEntry.COLUMN_TITLE + " TEXT NOT NULL," +
            MoviesEntry.COLUMN_PLOT + " TEXT NOT NULL," +
            MoviesEntry.COLUMN_RATING_AVERAGE + " REAL NOT NULL," +
            MoviesEntry.COLUMN_RATING_COUNT + " INTEGER NOT NULL," +
            MoviesEntry.COLUMN_RELEASE_DATE + " TEXT NOT NULL, " +
            MoviesEntry.COLUMN_MOVIE_TYPE + " INTEGER NOT NULL, " +
            "CHECK (" + MoviesEntry.COLUMN_MOVIE_TYPE + " IN (0,1,2))" + " );";

    //SQL statement to create the trailers table
    final String SQL_CREATE_TRAILERS_TABLE = "CREATE TABLE " +
            TrailersEntry.TABLE_NAME + " (" +
            TrailersEntry.COLUMN_VIDEO_ID + " TEXT PRIMARY KEY," +
            TrailersEntry.COLUMN_YOUTUBE_PATH + " TEXT NOT NULL," +
            TrailersEntry.COLUMN_VIDEO_NAME + " TEXT NOT NULL," +
            TrailersEntry.COLUMN_MOVIE_ID + " INTEGER NOT NULL, "
            //COLUMN_MOVIE_ID is a foreign key to favourites table
            + " FOREIGN KEY (" + TrailersEntry.COLUMN_MOVIE_ID + ") REFERENCES " +
            MoviesEntry.TABLE_NAME + " (" + MoviesEntry.COLUMN_MOVIE_ID + "), " +
            //Each trailer for a movie has to be unique
            " UNIQUE (" + TrailersEntry.COLUMN_VIDEO_ID + ", " +
            TrailersEntry.COLUMN_MOVIE_ID + ") ON CONFLICT REPLACE);";

    //SQL statement to create the reviews table
    final String SQL_CREATE_REVIEWS_TABLE = "CREATE TABLE " +
            ReviewsEntry.TABLE_NAME + " (" +
            ReviewsEntry.COLUMN_REVIEW_ID + " TEXT PRIMARY KEY," +
            ReviewsEntry.COLUMN_AUTHOR + " TEXT NOT NULL," +
            ReviewsEntry.COLUMN_CONTENT + " TEXT NOT NULL," +
            ReviewsEntry.COLUMN_MOVIE_ID + " INTEGER NOT NULL, " +
            //COLUMN_MOVIE_ID is a foreign key to the favourites table
            " FOREIGN KEY (" + ReviewsEntry.COLUMN_MOVIE_ID + ") REFERENCES " +
            MoviesEntry.TABLE_NAME + " (" + MoviesEntry.COLUMN_MOVIE_ID + "), " +
            //Each review for a movie has to be unique
            " UNIQUE (" + ReviewsEntry.COLUMN_REVIEW_ID + ", " +
            ReviewsEntry.COLUMN_MOVIE_ID + ") ON CONFLICT REPLACE);";

    db.execSQL(SQL_CREATE_FAVOURITES_TABLE);
    db.execSQL(SQL_CREATE_TRAILERS_TABLE);
    db.execSQL(SQL_CREATE_REVIEWS_TABLE);

你能帮我弄清楚如何构造删除语句来完成这个吗?

非常感谢。

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

    基于thisthis,我认为您可以执行以下操作:

    DELETE FROM Reviews
    WHERE movie_id NOT IN (SELECT m.id 
                        FROM Movies m where movie_type = 2)
    
    DELETE FROM Trailers
    WHERE movie_id NOT IN (SELECT m.id 
                        FROM Movies m where movie_type = 2)
    
    DELETE FROM Movies WHERE movie_type = 2
    

    【讨论】:

      最近更新 更多