首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在MySQL中,如何复制表和依赖于父表ID的支持表中的现有记录?

在MySQL中,如何复制表和依赖于父表ID的支持表中的现有记录?
EN

Stack Overflow用户
提问于 2019-06-11 23:58:08
回答 1查看 44关注 0票数 0

假设我有一个包含core的表和两个支持表,我们将它们分别称为activitysteps

核心可能包含以下内容:

代码语言:javascript
复制
coreID(int) | coreLabel(varchar)
--------------------------------
1           | Wash Car
12          | Wash Dog
15          | Vacuum the carpet

Activity可能包含以下内容:

代码语言:javascript
复制
aID(int auto) | coreID(int fk) | menuID(int fk)
-----------------------------------------------
1             | 1              | 268
2             | 1              | 269
3             | 12             | 269
4             | 12             | 239
5             | 12             | 230
6             | 15             | 237
7             | 15             | 269
8             | 15             | 244
9             | 15             | 242

Steps可能包含以下内容:

代码语言:javascript
复制
stepID(int auto) | coreID(int fk) | aID(int fk)
-----------------------------------------------
1                | 1              | 1
2                | 1              | 2
3                | 12             | 5
4                | 12             | 6
5                | 12             | 9
6                | 15             | 10
7                | 15             | 11
8                | 15             | 26

该网站将显示核心项目。用户应该能够单击按钮来复制项目(例如,复制洗手狗,coreID=2),以便核心现在将具有值

代码语言:javascript
复制
coreID(int) | coreLabel(varchar)
--------------------------------
1           | Wash Car
12          | Wash Dog
15          | Vacuum the carpet
16           | Wash Dog (copy)

...and Activity中的数据应如下所示:

代码语言:javascript
复制
aID(int auto) | coreID(int fk) | menuID(int fk)
-----------------------------------------------
1             | 1              | 268
2             | 1              | 269
3             | 12             | 269
4             | 12             | 239
5             | 12             | 230
6             | 15             | 237
7             | 15             | 269
8             | 15             | 244
9             | 15             | 242
10            | 16             | 268
11            | 16             | 269

...and then Steps应该如下所示:

代码语言:javascript
复制
stepID(int auto) | coreID(int fk) | aID(int fk)
-----------------------------------------------
1                | 1              | 1
2                | 1              | 2
3                | 12             | 5
4                | 12             | 6
5                | 12             | 9
6                | 15             | 10
7                | 15             | 11
8                | 15             | 26
9                | 16             | 10
10               | 16             | 11

复制核心Activity中的记录很简单,我没有任何问题。我不知道如何复制步骤中的支持记录,因为当记录被插入到Activity中时,插入的aID值是插入到步骤中所必需的,而这正是我的困境所在……MySQL可以用我在这里找到的触发器https://dba.stackexchange.com/questions/37470/cascading-inserts-in-mysql来处理这个问题吗?如果可以,我该如何传递非默认值?

更新表上的触发器将不起作用。我需要能够将数据添加到Activity表中,而无需数据库也向step表中添加一行。通常情况下,我认为该解决方案会起作用,但在这种情况下不会。

更新#2我创建了一个database fiddle。这是由源自我的真实源数据的样本数据组成的,但已被简化,因此希望样本数据是足够的。

代码语言:javascript
复制
CREATE TABLE `core` (
    `coreID` INT(11) NOT NULL AUTO_INCREMENT,
    `coreLabel` VARCHAR(150) NOT NULL DEFAULT 'Untitled',
    PRIMARY KEY (`coreID`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1
;

CREATE TABLE `activity` (
    `aID` INT(11) NOT NULL AUTO_INCREMENT,
    `coreID` INT(11) NULL DEFAULT NULL,
    `menuID` INT(11) NULL DEFAULT NULL,
    PRIMARY KEY (`aID`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1
;

CREATE TABLE `steps` (
    `stepID` INT(11) NOT NULL AUTO_INCREMENT,
    `coreID` INT(11) NULL DEFAULT NULL,
    `aID` INT(11) NOT NULL,
  PRIMARY KEY (`stepID`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1
;

insert into core (corelabel) values ('Wash Car');
insert into core (corelabel) values ('Wash Dog');
insert into core (corelabel) values ('Vacuum Rug');

insert into activity (coreID, menuID) values (1,268);
insert into activity (coreID, menuID) values (1,269);
insert into activity (coreID, menuID) values (12,268);
insert into activity (coreID, menuID) values (12,239);
insert into activity (coreID, menuID) values (12,230);
insert into activity (coreID, menuID) values (15,237);
insert into activity (coreID, menuID) values (15,269);
insert into activity (coreID, menuID) values (15,244);
insert into activity (coreID, menuID) values (15,242);
insert into activity (coreID, menuID) values (4,268);


insert into steps (coreID, aID) values (1,1);
insert into steps (coreID, aID) values (1,2);
insert into steps (coreID, aID) values (12,5);
insert into steps (coreID, aID) values (12,6);
insert into steps (coreID, aID) values (12,9);
insert into steps (coreID, aID) values (15,10);
insert into steps (coreID, aID) values (15,11);
insert into steps (coreID, aID) values (15,26);

select * from core;
select * from activity;
select * from steps;
Select
    c.coreID,
    c.coreLabel,
    a.aID,
    a.menuID,
    s.stepID
From
    core c Left Join
    activity a On a.coreID = c.coreID Left Join
    steps s On s.aID = a.aID;

--如果我们假装一个按钮被点击来复制"Wash Car",我们会期望下面的插入发生;

--问题实际上是以编程方式获取这些值;

代码语言:javascript
复制
insert into core (corelabel) values ('Wash Car (copy)');
insert into activity (coreID, menuID) values (4,269);   
insert into steps (coreID, aID) values (4,10);
insert into steps (coreID, aID) values (4,11);

Select
    c.coreID,
    c.coreLabel,
    a.aID,
    a.menuID,
    s.stepID
From
    core c Left Join
    activity a On a.coreID = c.coreID Left Join
    steps s On s.aID = a.aID;

最后一个select查询(见上)返回4条记录。这应该是正确的,因为“洗车”有两个步骤。场景是用户想要使用"Wash Car“作为另一个过程的模板。点击网站上“洗车”旁边的复制按钮后,我们应该会看到返回了6条记录,并且应该会看到“洗车(拷贝)”的条目。

EN

回答 1

Stack Overflow用户

发布于 2019-06-12 00:37:08

代码语言:javascript
复制
CREATE TRIGGER steps_ti 
AFTER INSERT ON `Activity` 
FOR EACH ROW 
INSERT INTO Steps (aID,coreID) VALUES (NEW.aID,NEW.coreID);  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56547617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档