1

所以我有两个由键'skillid'链接的表:

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

但是我不知道如何在一个 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生成的是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());

返回的值将在所有四行中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 演示

于 2012-08-03T19:50:44.790 回答
1

由于students_skills.ssid是一AUTO_INCREMENT列,因此您的第二个插入看起来是错误的。看来您想要以下内容:

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 回答