心急的朋友可以直接跳到最后看解决方法:
先初始化表数据:
CREATE TABLE `t_user` (
`id` bigint(20) NOT NULL,
`user_name` varchar(100) DEFAULT NULL COMMENT '姓名',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
CREATE TABLE `t_user_extend` (
`id` bigint(20) NOT NULL COMMENT '主键',
`user_id` bigint(20) DEFAULT NULL COMMENT '用户id',
`age` int(3) DEFAULT NULL COMMENT '年龄',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户拓展信息表';
INSERT INTO `t_user`(`id`, `user_name`) VALUES (1, '张三');
INSERT INTO `t_user`(`id`, `user_name`) VALUES (2, '李四');
INSERT INTO `t_user`(`id`, `user_name`) VALUES (3, '王五');
INSERT INTO `t_user_extend`(`id`, `user_id`, `age`) VALUES (1, 1, 20);
INSERT INTO `t_user_extend`(`id`, `user_id`, `age`) VALUES (2, 2, 21);
在 mysql标准的sql语法中: https://dev.mysql.com/doc/refman/8.0/en/delete.html 连表删除时,不允许使用
[LIMIT row_count]
并且如果想通过子查询的方式如:
DELETE
u, e
FROM t_user u
LEFT JOIN t_user_extend e ON u.id = e.user_id
WHERE u.id IN (
SELECT id FROM t_user LIMIT 0, 2
)
这样也会报:This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' (目前我使用的mysql版本是:8.0.37,可能以后版本的mysql会支持这种子查询的删除方法)
解决方案:
所以,要连表删除并limit条数时,不妨试试用 join 的方式:
DELETE
u, e
FROM t_user u
LEFT JOIN t_user_extend e ON u.id = e.user_id
INNER JOIN (
SELECT id FROM t_user LIMIT 0, 2
) sub ON u.id = sub.id;
执行结果:

2038

被折叠的 条评论
为什么被折叠?



