首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从多个表中删除MySQL,其中可以在同一表中的不同列中找到键

从多个表中删除MySQL,其中可以在同一表中的不同列中找到键
EN

Stack Overflow用户
提问于 2014-03-26 16:30:18
回答 3查看 104关注 0票数 0

我有多个表,保存关于用户和内容的信息。

代码语言:javascript
复制
Table users: 
id     name
 5     foo
33     abc
代码语言:javascript
复制
Table imgs:
id     uid    img_name
1       5        bar
8      33        xy
代码语言:javascript
复制
Table user_permissions: 
id     uid    permission_id
1      5         3
2      3         3
代码语言:javascript
复制
Table liked_content: 
id     contente_id    content_holder_id     likedby_id
1           8                33                   5
2           1                 5                  56

如果用户被删除,我希望删除与他的用户id相关的所有表中的所有行。如果我在每个表中只添加一列,这就很好了。

代码语言:javascript
复制
DELETE users,
       imgs,
       user-permissions,
       liked_content
FROM users,
     imgs,
     user-permissions,
     liked_content
WHERE imgs.uid = users.id AND
      user_permissions.uid = users.id AND
      liked_content.content_holder_id = users.id AND
      users.id  = 5

在WHER-子句(如not _ id /liked_content-table)中添加可以找到id的第二行将无法工作。

代码语言:javascript
复制
...
WHERE imgs.uid = users.id AND
      user_permissions.uid = users.id AND
      liked_content.content_holder_id = users.id AND
      liked_content.likedby_id = users.id AND
      users.id  = 5

对已经列出的表的查询添加第二列的正确方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-26 17:40:29

根据您的数据,用户id可以是liked_content表中的content_holder_id likedby_id。不一定兼而有之。其中的条款应改为:

代码语言:javascript
复制
...
  WHERE imgs.uid = users.id AND
  user_permissions.uid = users.id AND
  (liked_content.content_holder_id = users.id OR
  liked_content.likedby_id = users.id) AND
  users.id  = 5

如果使用外键约束和级联删除规则,则不必手动执行此操作。

票数 0
EN

Stack Overflow用户

发布于 2014-03-26 16:42:59

您正在实现的是一个级联删除。它通常内置在DB引擎中。请查看以下相关问题:MySQL foreign key constraints, cascade delete,如果您自己已经死了,我建议您在一个事务中使用多个delete语句,这些语句可以从子到父遍历您的模式:

代码语言:javascript
复制
DELETE 
FROM liked_content
WHERE content_holder_id = 5;

DELETE 
FROM imgs
WHERE uid = 5;

DELETE 
FROM user-permissions
WHERE uid = 5;

DELETE 
FROM users
WHERE id = 5;
票数 0
EN

Stack Overflow用户

发布于 2017-02-23 20:58:31

正如其他人所说,技术上正确的方法是设置级联删除。

如果我负责数据库,我不会愿意这样做的,因为您会发现试图操作表非常痛苦,尤其是当您试图创建示例数据时。

我会选择亲吻法..。

对每个从属表分别引用用户id进行删除,然后删除主记录。

如果您执行外键和级联操作,您将不喜欢它对内容表所做的操作,因为它与主用户表有两个关系。

例如,这意味着,如果您试图删除holder_id 5的内容行,则首先必须通过将likedby_id设置为NULL,将这些行与其关联的likedby_id主记录断开连接,否则级联将删除likedby_id主记录。但是,它也不允许您使likedby_id为空,因为这样做会使实际执行级联所需的外键关系无效。

帮你自己一个忙-简单点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22667364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档