客戶的項目有個需求:根據帖子類別取每類帖子前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 p_view p2 WHERE p.classId = p2.classId AND p2.hot>p.hot ORDER BY p.hot DESC
)
ORDER BY p.`classId`
) temp_post
)
問題解決。
p_view 視圖詳細創建語句如下:
DELIMITER $$
USE `pet_dev`$$
DROP VIEW IF EXISTS `p_view`$$
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `p_view` AS (
SELECT
`p`.`id` AS `id`,
`p`.`title` AS `title`,
`p`.`class_id` AS `classId`,
`p`.`last_reply_time` AS `lastReplyTime`,
`p`.`author_id` AS `authorId`,
`p`.`author` AS `author`,
`p`.`review_amount` AS `reviewAmount`,
((`p`.`review_amount` + `p`.`click_amount`) + `p`.`approve_amount`) AS `hot`
FROM `post` `p`
WHERE ((TO_DAYS(`p`.`create_time`) = TO_DAYS(NOW()))
AND (`p`.`class_id` IS NOT NULL)
AND (`p`.`del_flag` = 0))
ORDER BY ((`p`.`review_amount` + `p`.`click_amount`) + `p`.`approve_amount`)DESC)$$
DELIMITER ;
帖子表post如下:
CREATE TABLE `post` (
`id` int(32) NOT NULL AUTO_INCREMENT COMMENT '論壇ID',
`title` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '標題',
`title_picture` varchar(256) CHARACTER SET utf8 DEFAULT NULL COMMENT '標題圖片',
`CONTENT` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '評論內容',
`click_amount` int(8) DEFAULT NULL COMMENT '點擊量',
`review_amount` int(8) DEFAULT NULL COMMENT '評論量',
`type` int(1) DEFAULT NULL COMMENT '類型(圖片、視頻)',
`create_time` datetime DEFAULT NULL COMMENT '時間',
`status` int(1) unsigned zerofill DEFAULT NULL COMMENT '狀態',
`del_flag` int(1) DEFAULT NULL COMMENT '刪除標誌',
`author` varchar(12) CHARACTER SET utf8 DEFAULT NULL COMMENT '作者',
`city_name` varchar(50) CHARACTER SET utf8 DEFAULT NULL COMMENT '城市ID',
`approve_amount` int(8) DEFAULT NULL COMMENT '點贊量',
`last_reply_time` datetime DEFAULT NULL COMMENT '最後回覆時間',
`class_id` int(32) DEFAULT NULL COMMENT '類別ID',
`author_id` int(11) DEFAULT NULL,
`is_examine` int(2) DEFAULT '0' COMMENT '管理員是否已查看',
`is_essential` int(2) DEFAULT '0' COMMENT '是否是精華帖,0不是,1是',
`is_sticky` int(2) DEFAULT '0' COMMENT '是否是置頂帖,0不是,1是',
`is_hot` int(2) DEFAULT '0' COMMENT '是否加火 0不是,1是',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=948 DEFAULT CHARSET=utf8mb4