与mysql外键混淆

时间:2012-10-10 13:20:09

标签: mysql database foreign-keys

我对外键以及它们应该如何工作有点困惑。

我在数据库中有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')

4 个答案:

答案 0 :(得分:2)

primary key是唯一标识表中行的列。对于您的用户表,它仅为apID,对于hobbiesskills表,它只是hIDsIDhID + apID和{ {1}}(取决于您的数据代表什么)。

sID + apID是对另一个表中的值的反映。因此,如果foreign key中的apID上的外键约束重新hobbies中的apID,则表示user中的每个apID都必须在hobbies中匹配apID。如果您尝试在userhobbies中插入或更新一行,以便匹配对消失,则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 CASCADEhobbies之前,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作为外键的两个表skillsuser.userID。 您需要hobbiesskills中的主键(例如hobbiesIDskillsID)。 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