2

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

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

4 回答 4

2

是唯一标识表中行的primary key列。对于您的用户表,它是公正apID的,对于hobbiesandskills表,它是公正的hIDsIDhID + apIDsID + apID(取决于您的数据代表什么)。

Aforeign key是对另一个表中的值的引用。因此,如果您对apIDinhobbies的引用有外键约束,则意味着每个apIDin都必须有一个匹配的 in 。如果您尝试在其中插入或更新一行以使匹配对消失,MySQL 将抛出错误。userapIDhobbiesapIDuserhobbiesuser

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条款。这样一来,如果您更新apIDin user,数据库将更新它必须输入的任何行,hobbies以便一切保持同步。也有类似的东西ON DELETE CASCADE,但如果你做一些研究,应该很容易找到。

至于如何插入数据,你照常做。唯一需要注意的是,在您可以插入hobbiesor之前,表中必须已经skills存在匹配项。apIDuser

这是一个SQL Fiddle,它显示了所有这些东西。

于 2012-10-10T13:55:54.790 回答
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 |
+-----+------+
于 2012-10-10T14:13:07.103 回答
0

对不起,但你写的有点令人困惑。我希望我理解你的问题。

如果您有一个user带有主键的表,以及userID两个用作外键的表。和(例如和)都需要一个主键。不能是/的主键,因为它不是唯一的;它只是用作外键来形成表和/表之间的关系。hobbiesskillsuser.userIDhobbiesskillshobbiesIDskillsIDuserIDhobbiesskillsuserhobbiesskills

于 2012-10-10T13:28:33.753 回答
0

1.table parent = user 这里apID是主键

2.table child = hobbies 这里hID为主键,apID为外键

3.table child2 = 这里sID是主键,apID是外键的技能

--插入命令

1.INSERT INTO用户

2.INSERT INTO hobbies here 你必须从 users 表中选择 apID

3.INSERT INTO技能在这里你必须从users表中选择apID

于 2012-10-10T13:30:41.193 回答