Php 具有关系表的数据库中存在重复行

Php 具有关系表的数据库中存在重复行,php,mysql,Php,Mysql,我正在尝试复制数据库中的一个页面和所有相关行 我遇到的问题是因为page\u group\u id是这两个表的标识符。在不循环每个新的“页面组”记录的情况下,有没有办法做到这一点 页面(页面id、页面名称等) 页面组(页面组id、页面id等) 页面组项目(页面组id、项目id等) 更新: -- -- Table structure for table `pages` -- CREATE TABLE IF NOT EXISTS `pages` ( `page_id` int(11) NO

我正在尝试复制数据库中的一个页面和所有相关行

我遇到的问题是因为
page\u group\u id
是这两个表的标识符。在不循环每个新的“页面组”记录的情况下,有没有办法做到这一点

  • 页面(页面id、页面名称等)
  • 页面组(页面组id、页面id等)
  • 页面组项目(页面组id、项目id等)
更新

--
-- Table structure for table `pages`
--

CREATE TABLE IF NOT EXISTS `pages` (
  `page_id` int(11) NOT NULL AUTO_INCREMENT,
  `page_name` varchar(255) NOT NULL,
  PRIMARY KEY (`page_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Dumping data for table `pages`
--

INSERT INTO `pages` (`page_id`, `page_name`) VALUES
(1, 'My Page'),
(2, 'My other page');

-- --------------------------------------------------------

--
-- Table structure for table `page_groups`
--

CREATE TABLE IF NOT EXISTS `page_groups` (
  `page_group_id` int(11) NOT NULL AUTO_INCREMENT,
  `page_group_name` varchar(255) NOT NULL,
  `page_id` int(11) NOT NULL,
  PRIMARY KEY (`page_group_id`),
  KEY `page_id` (`page_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Dumping data for table `page_groups`
--

INSERT INTO `page_groups` (`page_group_id`, `page_group_name`, `page_id`) VALUES
(1, 'My Group', 1),
(2, 'My Group', 2);

-- --------------------------------------------------------

--
-- Table structure for table `page_group_items`
--

CREATE TABLE IF NOT EXISTS `page_group_items` (
  `page_group_id` int(11) NOT NULL,
  `item_id` int(11) NOT NULL,
  KEY `item_id` (`item_id`),
  KEY `page_group_id` (`page_group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `page_group_items`
--

INSERT INTO `page_group_items` (`page_group_id`, `item_id`) VALUES
(1, 1),
(1, 2),
(1, 3),
(2, 1),
(2, 2);

由于复制时要替换每个表中唯一的唯一标识符(主键),因此我无法找到不向表中添加临时锚列的方法,请执行复制并再次删除它们。像这样的东西

ALTER TABLE pages ADD originalpageid INT;
UPDATE pages set originalpageid=page_id;
ALTER TABLE page_groups ADD originalpagegroupid INT;
UPDATE page_groups SET originalpagegroupid=page_group_id;

INSERT INTO pages (page_name,originalpageid)  
  SELECT page_name,originalpageid FROM pages;

INSERT INTO page_groups (page_group_name,page_id,originalpagegroupid) 
  SELECT page_group_name,MAX(pages.page_id),originalpagegroupid
  FROM page_groups
  JOIN pages 
    ON page_groups.page_id=originalpageid
  GROUP BY originalpageid,page_group_name,originalpagegroupid;

INSERT INTO page_group_items(page_group_id,item_id)
  SELECT MAX(page_groups.page_group_id),item_id
  FROM page_group_items
  JOIN page_groups
    ON page_group_items.page_group_id=originalpagegroupid
  GROUP BY originalpagegroupid,item_id;

ALTER TABLE pages DROP COLUMN originalpageid;
ALTER TABLE page_groups DROP COLUMN originalpagegroupid;

如果用例一直在系统中执行,那么它可能不是您正在寻找的解决方案,但是对于手动干预,它应该工作得很好


一如既往,在运行来自Internet上随机陌生人的SQL之前,请始终备份您的数据库:)

您可以添加一些示例数据和所需结果吗?所需结果将是在复制页面时,例如page_id=1其他两个表中引用此页面的所有内容也将被复制并更新到新页面_id这是您想要的吗用于别名?[ [1]: