【问题标题】:How can I insert multiple rows into one table, then into another table using an auto incremented ID? mysql如何将多行插入一个表,然后使用自动递增的 ID 插入另一个表? mysql
【发布时间】:2012-08-03 18:44:49
【问题描述】:

所以我有两个表通过键 '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_2 外键 (skillid) 引用 skills (skillid))

我是否在正确的路线上?我也研究了连接,但这种方法对我来说更有意义。

感谢任何帮助或有用的链接。

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    您必须确保使用多行插入语法,以便 LAST_INSERT_ID() 保持一致,即使您正在自动增加另一列:

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

    假设生成的skillid1,那么你可以这样做:

    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 Demo

    【讨论】:

      【解决方案2】:

      由于 students_skills.ssidAUTO_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 |
      +-----------------+--------------------------------------------------------------------
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-17
        • 1970-01-01
        • 2015-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多