关于重复密钥:不明确


ON DUPLICATE KEY: Ambiguous

以下数据库结构:
表cms_pages包含id、名称、标题等页面
表cms_pagerows包含具有cms_page_id和秩的行
(cms_page_id上的唯一索引,排名(
Pagerows应该包含列,而这些列又包含。。。内容

现在,我想使用php在现有页面的cms_pagerows中插入一个新的pagerow
由于删除了旧的页面行,排名不一定是连续的数字
为此,我有一个带有以下SQL的函数insertRowAt($page_name,$offset(:

INSERT INTO `cms_pagerows` (`cms_page_id`, `rank`)
SELECT `cms_pages`.`id`, `cms_pagerows`.`rank` + 1
FROM `cms_pages`, `cms_pagerows`
WHERE `cms_pages`.`name` = "'.$page_name.'"
AND `cms_pagerows`.`cms_page_id` = `cms_pages`.`id`
ORDER BY `rank` DESC
LIMIT 0, "'.$offset.'"
ON DUPLICATE KEY UPDATE `cms_pagerows`.`rank` = `cms_pagerows`.`rank` + 1

当尝试运行它时,我得到以下错误消息:"字段列表中的列'cms_pagerows.rank'不明确">

关键是始终使用表别名来消除列的歧义:

INSERT INTO `cms_pagerows`(`cms_page_id`, `rank`)
    SELECT p.`id`, pr.`rank` + 1
    FROM `cms_pages` p join
         `cms_pagerows` pr
          on pr.`cms_page_id` = p.`id`
    WHERE p.`name` = "'.$page_name.'"
    ORDER BY pr.`rank` DESC
    LIMIT 0, "'.$offset.'"
    ON DUPLICATE KEY UPDATE `rank` = pr.`rank` + 1;

你也可以说:

    ON DUPLICATE KEY UPDATE `rank` = VALUES(`rank`)

这样做是因为select已经插入了正确的秩,所以您可以使用该值。

试试这个。。

INSERT INTO `cms_pagerows` (`cms_page_id`, `rank`)
SELECT `cms_pages`.`id`, `cms_pagerows`.`rank` + 1 AS rank1
FROM `cms_pages`, `cms_pagerows`
WHERE `cms_pages`.`name` = "'.$page_name.'"
AND `cms_pagerows`.`cms_page_id` = `cms_pages`.`id`
ORDER BY rank1 DESC
LIMIT 0, "'.$offset.'"
ON DUPLICATE KEY UPDATE `rank` = rank1 + 1

两个rank字段冲突,因为您使用的名称相同。。。使用mysqlAS关键字。。