假设我有一个包含core
的表和两个支持表,我们将它们分别称为activity
和steps
。
核心可能包含以下内容:
coreID(int) | coreLabel(varchar)
--------------------------------
1 | Wash Car
12 | Wash Dog
15 | Vacuum the carpet
Activity可能包含以下内容:
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可能包含以下内容:
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),以便核心现在将具有值
coreID(int) | coreLabel(varchar)
--------------------------------
1 | Wash Car
12 | Wash Dog
15 | Vacuum the carpet
16 | Wash Dog (copy)
...and Activity中的数据应如下所示:
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应该如下所示:
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。这是由源自我的真实源数据的样本数据组成的,但已被简化,因此希望样本数据是足够的。
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",我们会期望下面的插入发生;
--问题实际上是以编程方式获取这些值;
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条记录,并且应该会看到“洗车(拷贝)”的条目。
https://stackoverflow.com/questions/56547617
复制相似问题