我有多个表,保存关于用户和内容的信息。
Table users:
id name
5 foo
33 abcTable imgs:
id uid img_name
1 5 bar
8 33 xyTable user_permissions:
id uid permission_id
1 5 3
2 3 3Table liked_content:
id contente_id content_holder_id likedby_id
1 8 33 5
2 1 5 56如果用户被删除,我希望删除与他的用户id相关的所有表中的所有行。如果我在每个表中只添加一列,这就很好了。
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的第二行将无法工作。
...
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对已经列出的表的查询添加第二列的正确方法是什么?
发布于 2014-03-26 17:40:29
根据您的数据,用户id可以是liked_content表中的content_holder_id 或 likedby_id。不一定兼而有之。其中的条款应改为:
...
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如果使用外键约束和级联删除规则,则不必手动执行此操作。
发布于 2014-03-26 16:42:59
您正在实现的是一个级联删除。它通常内置在DB引擎中。请查看以下相关问题:MySQL foreign key constraints, cascade delete,如果您自己已经死了,我建议您在一个事务中使用多个delete语句,这些语句可以从子到父遍历您的模式:
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;发布于 2017-02-23 20:58:31
正如其他人所说,技术上正确的方法是设置级联删除。
如果我负责数据库,我不会愿意这样做的,因为您会发现试图操作表非常痛苦,尤其是当您试图创建示例数据时。
我会选择亲吻法..。
对每个从属表分别引用用户id进行删除,然后删除主记录。
如果您执行外键和级联操作,您将不喜欢它对内容表所做的操作,因为它与主用户表有两个关系。
例如,这意味着,如果您试图删除holder_id 5的内容行,则首先必须通过将likedby_id设置为NULL,将这些行与其关联的likedby_id主记录断开连接,否则级联将删除likedby_id主记录。但是,它也不允许您使likedby_id为空,因为这样做会使实际执行级联所需的外键关系无效。
帮你自己一个忙-简单点。
https://stackoverflow.com/questions/22667364
复制相似问题