1

そのため、キー「skillid」でリンクされた 2 つのテーブルがあります。

skills
+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| skillid   | int(11)     | NO   | PRI | NULL    | auto_increment |
| skillname | varchar(30) | NO   |     | NULL    |                |
+-----------+-------------+------+-----+---------+----------------+

students_skills
+-----------+---------+------+-----+---------+----------------+
| Field     | Type    | Null | Key | Default | Extra          |
+-----------+---------+------+-----+---------+----------------+
| ssid      | int(11) | NO   | PRI | NULL    | auto_increment |
| studentid | int(11) | NO   | MUL | NULL    |                |
| skillid   | int(11) | NO   | MUL | NULL    |                |
+-----------+---------+------+-----+---------+----------------+

複数の行をスキル テーブルに挿入し、作成された ID に基づいてこれらを student_skills に挿入しようとしています。LAST_INSERT_ID() 関数の使用を検討しています。

INSERT INTO skills (skillid , skillname)
    VALUES(NULL,'being grateful for help'); # generate ID by inserting NULL
INSERT INTO students_skills (ssid, studentid, skillid)
    VALUES(LAST_INSERT_ID(),'1', '2'); # use ID in second table

しかし、1 つの mysql テーブルで一度に複数の行に対してこれを行う方法がわかりませんでした。すべての行に対して上記の 4 行を単純に複製すると、エラーが発生します。

エラー: #1452 - 子行を追加または更新できません: 外部キー制約が失敗しました ( empology. students_skills, CONSTRAINT students_skills_ibfk_2FOREIGN KEY ( skillid) REFERENCES skills ( skillid))

私は正しい方向に進んでいますか?結合も調べましたが、この方法は私にとってより理にかなっています。

ヘルプや便利なリンクをありがとう。

4

2 に答える 2

3

別の列を自動インクリメントしている場合でも、一貫性が保たれるように、複数行の挿入構文を使用する必要がLAST_INSERT_ID()あります。

INSERT INTO skills VALUES (NULL, 'test');

skillid生成された wasと言うと、次の1ことができます。

INSERT INTO student_skills VALUES
(NULL, 1, LAST_INSERT_ID()),
(NULL, 2, LAST_INSERT_ID()),
(NULL, 3, LAST_INSERT_ID()),
(NULL, 4, LAST_INSERT_ID());

によって返される値は、4 行すべてでLAST_INSERT_ID()一貫して同じ ( ) のままです。1

ただし、複数の挿入をスタンドアロン ステートメントとして実行するLAST_INSERT_ID()と、各挿入の生成された自動インクリメント値が代わりに含まれるため、 が変更されます。

INSERT INTO student_skills VALUES (NULL, 1, LAST_INSERT_ID());
INSERT INTO student_skills VALUES (NULL, 2, LAST_INSERT_ID());
INSERT INTO student_skills VALUES (NULL, 3, LAST_INSERT_ID());
INSERT INTO student_skills VALUES (NULL, 4, LAST_INSERT_ID());

LAST_INSERT_ID()直前の挿入の生成された ID はどこにありますか。


このSQLFiddle Demoを見てください

于 2012-08-03T19:50:44.790 に答える
1

students_skills.ssidAUTO_INCREMENT列なので、2番目の挿入は間違っているように見えます。次のことが必要なようです。

INSERT INTO skills (skillid , skillname)
    VALUES(NULL,'being grateful for help'); # generate ID by inserting NULL
INSERT INTO students_skills (ssid, studentid, skillid)
    VALUES(NULL,'1', LAST_INSERT_ID()); # use ID in second table

の出力を確認すると便利です

SHOW CREATE TABLE skills;
SHOW CREATE TABLE students_skills;

を表示しFOREIGN KEYsます。

出力を表示するための更新

+--------+------------------------------------------------------------------------------
| Table  | Create Table                                                                
+--------+------------------------------------------------------------------------------
| skills | CREATE TABLE `skills` (
  `skillid` int(11) NOT NULL AUTO_INCREMENT,
  `skillname` varchar(30) NOT NULL,
  PRIMARY KEY (`skillid`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1 |
+--------+------------------------------------------------------------------------------

+-----------------+---------------------------------------------------------------------
| Table           | Create Table                                                        
+-----------------+---------------------------------------------------------------------
| students_skills | CREATE TABLE `students_skills` (
  `ssid` int(11) NOT NULL AUTO_INCREMENT,
  `studentid` int(11) NOT NULL,
  `skillid` int(11) NOT NULL,
  PRIMARY KEY (`ssid`),
  KEY `studentid` (`studentid`),
  KEY `skillid` (`skillid`),
  CONSTRAINT `students_skills_ibfk_1` FOREIGN KEY (`studentid`) REFERENCES `students` (`studentid`),
  CONSTRAINT `students_skills_ibfk_2` FOREIGN KEY (`skillid`) REFERENCES `skills` (`skillid`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1 |
+-----------------+--------------------------------------------------------------------
于 2012-08-03T19:23:01.897 に答える