假设我有一个包含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
复制
该网站将显示核心项目。用户应该能够单击按钮来复制项目(例如,复制洗手狗MySQL 复制表,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可以用我在这里找到的触发器来处理这个问题吗?如果可以,我该如何传递非默认值?
更新表上的触发器将不起作用。我需要能够将数据添加到Activity表中,而无需数据库也向step表中添加一行。通常情况下,我认为该解决方案会起作用,但在这种情况下不会。
更新#2我创建了一个。这是由源自我的真实源数据的样本数据组成的,但已被简化,因此希望样本数据是足够的。
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条记录,并且应该会看到“洗车(拷贝)”的条目。
(编辑:好传媒网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|