SQLite:删除除外键具有特定值的行之外的所有行

时间:2016-03-02 16:26:58

标签: android sqlite

我对SQL很新,我有以下问题:

我正在创建一个将3个表存储到数据库中的Android应用程序。

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

  • 预告片,与我称为预告片

  • 的自定义课程相关联
  • 评论,与我称为评论

  • 的自定义类相关联

当应用程序触发事件时,我想创建一个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);

你能帮我弄清楚如何构造一个能完成此任务的删除语句吗?

非常感谢。

1 个答案:

答案 0 :(得分: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