客户的项目有个需求:根据帖子类别取每类帖子前10条作为加火帖。
更新is_hot状态的时候遇到这个问题(hibernate持久层异常):
could not execute native bulk manipulation query
sql语句如下:
UPDATE post SET is_hot = 1
WHERE id IN (
SELECT p.id
FROM p_view p
WHERE 10 >
(
SELECT COUNT(0) FROM p_view p2 WHERE p.classId = p2.classId AND p2.hot>p.hot ORDER BY p.hot DESC
)
ORDER BY p.`classId`
)
而在MySQL中异常是这样的:
The definition of table 'p' prevents operation UPDATE on table 'post'.
顾名思义,视图p_view起的别名p这查询出来的数据阻止了更新post(帖子)的语句。
而视图p_view是在post基础上建立起来的,不允许在查询视图的同时更新post表的内容,所以更新post表,需要将p_view 查询的ID数据重新包装构成一个临时表,修改如下:
UPDATE post SET is_hot = 1
WHERE id IN (
SELECT temp_post.id
FROM (
SELECT p.id
FROM p_view p
WHERE 10 >
(
SELECT COUNT(0) FROM