我对外键以及它们应该如何工作有点困惑。
我在数据库中有3个表
database = mydb
table parent = user
table child = hobbies
table child2 = skills
*mydb.user have apID as primary and Auto Increment
*mydb.hobbies have apID with relation with mydb.user apID
and hID as auto increment
*mydb.skills hace apID with relation with mydb.user apID
and sID as auto increment
我对如何插入数据感到困惑,以便爱好和技能中的apID是一样的? 爱好和技能的哪些关键需要是主要的,外国的还是其他的?
好吧我最终得到了
INSERT INTO `mydb`.`user` (`appID`, `name`) VALUES (NULL, 'pedro');
INSERT INTO `skills` (`appID`,`dipID`,`name``) VALUES(LAST_INSERT_ID(),NULL,'running')
答案 0 :(得分:2)
primary key
是唯一标识表中行的列。对于您的用户表,它仅为apID
,对于hobbies
和skills
表,它只是hID
和sID
或hID + apID
和{ {1}}(取决于您的数据代表什么)。
sID + apID
是对另一个表中的值的反映。因此,如果foreign key
中的apID
上的外键约束重新hobbies
中的apID
,则表示user
中的每个apID
都必须在hobbies
中匹配apID
。如果您尝试在user
或hobbies
中插入或更新一行,以便匹配对消失,则MySQL将抛出错误。
user
表可能如下所示:
hobbies
整齐的事情是CREATE TABLE hobbies (
hID INT(10) AUTO_INCREMENT NOT NULL,
apID INT(10),
PRIMARY KEY (hID, apID),
FOREIGN KEY (apID) REFERENCES user(apID) ON UPDATE CASCADE
);
条款。这将使得如果您更新ON UPDATE CASCADE
中的apID
,数据库将更新user
中的所有行,以便所有内容保持同步。还有像hobbies
之类的东西,但是如果你做一些研究那么应该很容易找到。
至于如何插入数据,你可以像往常一样。唯一需要注意的是,在您插入ON DELETE CASCADE
或hobbies
之前,skills
表中必须有匹配的apID
。
这是一个显示所有这些内容的SQL Fiddle。
答案 1 :(得分:1)
你有下一张桌子 -
CREATE TABLE `USER`(
APID INT(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (APID)
) ENGINE = INNODB AUTO_INCREMENT = 1;
CREATE TABLE HOBBIES(
HID INT(11) NOT NULL AUTO_INCREMENT,
APID INT(11) DEFAULT NULL,
PRIMARY KEY (HID),
CONSTRAINT FK_HOBBIES_USER_APID FOREIGN KEY (APID) REFERENCES `USER` (APID)
ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = INNODB AUTO_INCREMENT = 1;
CREATE TABLE SKILLS(
SID INT(11) NOT NULL AUTO_INCREMENT,
APID INT(11) DEFAULT NULL,
PRIMARY KEY (SID),
CONSTRAINT FK_SKILLS_USER_APID FOREIGN KEY (APID) REFERENCES `USER` (APID)
ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = INNODB AUTO_INCREMENT = 1;
我们的ID主要字段被声明为AUTO_INCREMENT,因此最好使用此功能 - 添加NULL值,MySQL将自己生成新的ID值(1,2,3等) -
-- Add first user and all his properties (hobbies, skills)
INSERT INTO user(apID) VALUES(NULL); -- We pass NULL
-- But real ID is 1, we set this value to variable @id
-- This @id will be used to insert correct foreign key values in child tables
SET @id = LAST_INSERT_ID();
-- Add some hobbies and skills for user 1
INSERT INTO hobbies(hID, apID) VALUES (NULL, @id);
INSERT INTO hobbies(hID, apID) VALUES (NULL, @id);
INSERT INTO hobbies(hID, apID) VALUES (NULL, @id);
INSERT INTO skills(sID, apID) VALUES (NULL, @id);
INSERT INTO skills(sID, apID) VALUES (NULL, @id);
INSERT INTO skills(sID, apID) VALUES (NULL, @id);
为每个用户执行相同的操作。
检查结果:
SELECT * FROM `user`;
+------+
| APID |
+------+
| 1 |
+------+
SELECT * FROM hobbies;
+-----+------+
| HID | APID |
+-----+------+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
+-----+------+
SELECT * FROM skills;
+-----+------+
| SID | APID |
+-----+------+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
+-----+------+
答案 2 :(得分:0)
如果您有一个包含主键user
的表userID
,以及使用hobbies
作为外键的两个表skills
和user.userID
。
您需要hobbies
和skills
中的主键(例如hobbiesID
和skillsID
)。 userID
/ hobbies
不能成为skills
/ user
的主键,因为它不是唯一的;它只是用作外键来形成hobbies
表和skills
/ {{1}}表之间的关系。
答案 3 :(得分:0)
1.table parent = user 这里apID是主键
2.table child =爱好 这里hID是主键,apID是外键
3.table child2 =技能 这里sID是主键,apID是外键
- INSERT COMMANDS
1.INSERT INTO用户
2.INSTO INTO爱好 在这里你必须从用户表中选择apID
3.INSERT INTO技能 在这里你必须从用户表中选择apID