【问题标题】:Delete entries from releted tables从相关表中删除条目
【发布时间】:2010-08-27 13:15:45
【问题描述】:

我有 2 张桌子:ContactsUsers

Contacts 表包含user_id,它们引用Users 表中的idContacts 还包含list_type 列。

Contacts: user_id, list_type Users: id, data

如何从两个表(ContactsUsers)中删除引用给定 list_type 的条目/行?

诀窍是我不想删除属于其他联系人list_typeusers

编辑:

例子:

Users (id,data)
1    John
2    Kate
3    Alan
4    Bob

Contacts (user_id, list_type)
1    1
3    1
1    2
4    2
2    2

现在我想删除list_type = 2,结果应该是:

Users (id,data)
1    John - still is here, because it was also referring to list_type = 1 
3    Alan

Contacts (user_id, list_type)
1    1
3    1

【问题讨论】:

    标签: sql android sqlite


    【解决方案1】:

    分为两步;

    SQLiteDatabase db;
            Cursor c = db
                    .query("Contacts", new String[] { "user_id" }, "list_type=?",
                            new String[] { "list_type_1" }, null, null, null);
    
            if(c.moveToFirst()){
                do{
                    db.delete("Users", "user_id=?",new String[]{c.getString(c.getColumnIndex("user_id"))});
                }while(c.moveToNext()));
            }
    
            db.delete("Contacts", "list_type=?", new String[]{"list_type_1"});
    

    【讨论】:

    • 看看编辑,我想我不会用这个答案来实现它。我还应该使用外键还是什么?
    • 使用外键很诱人,但我建议不要这样做,因为这会使它在用户中作为主键很尴尬。
    【解决方案2】:

    据我了解,我可以给你这个答案.. 我猜 users 表有 user_id 字段..我粗略地给出了这个,你让它对你的代码很舒服..:D

       select user_ids from contacts where list_type=some_type;
    
        while(resultSet.next()){
             String userid=restultSet.getString(1);
             delete from users where user_ids=userid;
        }
        delete from contacts where list_type=some_type;
    

    编辑:

    resultSet_1 = select user_ids from contacts where list_type=some_type;  
    
    while(resultSet_1.next()){
       String userid=resultSet_1.getString(1);
       resultSet_2 = select count(user_ids) from contacts where user_id=userid group by user_ids;
       int count=resultSet_2.getInt(1);
    
       if(count==1){     //if more than 1 it means contact is in more than one list_type
           delete from users where user_ids=userid;
       }
    }
    delete from contacts where list_type=some_type;
    

    【讨论】:

      【解决方案3】:

      我很想用 SQL 来做。我说,让数据库自行管理和清理。数据库和应用程序之间的来回操作更少,执行速度更快,需要维护的代码更少。

      从联系人中删除任何内容后,运行以下查询:

      DELETE FROM Users WHERE Id NOT IN (SELECT DISTINCT User_id FROM Contacts);
      

      或者您可以创建一个触发器并将其添加到您的架构中(这更加免提!):

      CREATE TRIGGER CleanUsers AFTER DELETE ON Contacts 
        BEGIN
          DELETE FROM Users WHERE Id NOT IN (SELECT DISTINCT User_id FROM Contacts);
        END;
      

      【讨论】:

      • @darbat:谢谢。我能问一下你最终选择的动机是什么吗?
      猜你喜欢
      • 2013-06-27
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 2021-02-26
      相关资源
      最近更新 更多