MySQL 之 The definition of table 'p' prevents operation UPDATE on table 'post'.

客戶的項目有個需求:根據帖子類別取每類帖子前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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章