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行を一意に識別する列です。ユーザー テーブルの場合は justapIDであり、hobbiesandskillsテーブルの場合は、hIDandsIDまたはhID + apIDandのいずれかですsID + apID(データが何を表しているかによって異なります)。

Aforeign keyは別のテーブルの値への参照です。そのため、 の参照で外部キー制約がオンapIDhobbiesなっている場合、それはすべてのapIDinに一致するin が必要userであることを意味します。またはで行を挿入または更新しようとすると、一致するペアがなくなるため、MySQL はエラーをスローします。apIDhobbiesapIDuserhobbiesuser

テーブルは次の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句です。これにより、 in を更新するapIDuser、データベースは必要なすべての行を更新してhobbies、すべてが同期されるようになります。のようなものもありON DELETE CASCADEますが、少し調べれば簡単に見つかるはずです。

データの挿入方法については、通常どおりに行います。hobbies唯一の注意点は、またはに挿入する前に、テーブルに既に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と2つのテーブルがhobbiesあり、それが外部キーとしてskills使用される場合。and (eg and )user.userIDの両方に主キーが必要になります。/の主キーになることはできません。これは、一意ではないためです。これは、テーブルと/テーブルの間の関係を形成するための外部キーとして使用されます。hobbiesskillshobbiesIDskillsIDuserIDhobbiesskillsuserhobbiesskills

于 2012-10-10T13:28:33.753 に答える
0

1.table parent = userここで、apIDは主キーです

2.table child =ここでの趣味hIDは主キーで、apIDは外部キーです

3.table child2 =ここでのスキルsIDは主キーであり、apIDは外部キーです

-コマンドを挿入

1.INSERTINTOユーザー

2.ここで趣味に挿入するユーザーテーブルからapIDを選択する必要があります

3.ここにINSERTINTOスキルを使用するには、usersテーブルからapIDを選択する必要があります

于 2012-10-10T13:30:41.193 に答える