gpt4 book ai didi

php - 数据库中具有关系表的重复行

转载 作者:行者123 更新时间:2023-11-29 13:56:02 25 4
gpt4 key购买 nike

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

我遇到的问题是因为page_group_id是两个表的标识符。有没有办法在不循环每个新的“page_groups”记录的情况下执行此操作?

  • 页面(page_id、page_name 等)
  • page_groups(page_group_id、page_id 等)
  • page_group_items(page_group_id、item_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);

最佳答案

由于您在复制时替换每个表中唯一的唯一标识符(主键),因此我看不到在不向表中添加临时 anchor 列的情况下执行此操作的方法,请执行复制并再次删除它们。像这样的东西;

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;

An SQLfiddle to test with

如果用例在系统中始终执行此操作,则它可能不是您正在寻找的解决方案,但对于手动干预,它应该可以很好地工作。

与往常一样,在运行来自 Internet 上的随机陌生人的 SQL 之前,请务必备份数据库:)

关于php - 数据库中具有关系表的重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15851895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com