一次将数据插入多个表时,自动增量无法正常工作

时间:2014-04-27 08:42:27

标签: mysql

一些注意事项:我使用INSERT IGNORE,因为我避免插入重复项。 'bookID','libraryID和'personID'是自动增量和主键。

假设我的数据库中有三个表。

表1'书籍':

bookID | bookTitle
     1 | 1st book
     2 | 2nd book

..........

表2'图书馆':

libraryID | bookID(from table 'book') | libraryName
        1 |                         1 | 1st library
        2 |                         1 | 2nd library
        3 |                         2 | 2nd library

.............

表3'出租':

personID | libraryID(from table 'libraries') | personName
       1 |                                 2 | John
       2 |                                 3 | Shaq

.................

我正在尝试使用以下查询一次在三个表中插入数据:

INSERT IGNORE INTO books (bookID,bookTitle)
VALUES ("",
        "1st book");

INSERT
IGNORE INTO libraries (libraryID,bookID,libraryName)
VALUES ("",
          (SELECT bookID
           FROM books
           WHERE bookTitle="1st book"),"1st library");

INSERT
IGNORE INTO rental (personID,libraryID,personName)
VALUES ("",
          (SELECT libraryID
           FROM libraries
           WHERE libraryName="1st library"
             AND bookID=
               (SELECT bookID
                FROM books
                WHERE bookTitle="1st book")),"Mark");

此查询有效。我插入了数千行。问题是ID。我在查询中将'bookID','libraryID'和'personID'值留空,并期望它是整数序列,我的意思是:1,2,3,4,5,6,7,8,9,...但是,我得到了这个:1,5,100,152,1112,3456,...所有ID都是随机数而不是正常序列。这件事发生在所有三个表中。我想我需要以某种方式修复我的查询。

是否可以根据需要修复查询?

编辑: 当我开始使用较新版本的MySQL(版本4.1.5)问题消失了。上面写的查询按我想要的方式工作(我不再有auto_increment问题)。 谢谢你们的建议。我很欣赏。

3 个答案:

答案 0 :(得分:0)

您不应在插入中使用任何与标题相关的检查(不使用id:s)。如果您插入两本标题相同的书,那就行不通。

常用方式如下:

  • 插入book而不指定ID并获取新的自动增量ID(在PHP中使用$mysqli->insert_id完成)
  • 通过选择/插入名称
  • 来创建/获取库ID
  • 使用这些ID插入新租借:s(不使用任何标题值)

租赁/借款人也应该拥有自己的ID字段。然后只需将这些ID链接到租赁表中即可。

答案 1 :(得分:0)

使用INSERT IGNORE时,会忽略重复键之类的错误。 AUTO_INCREMENT键(表的主键)会增加,但是你无法避免这种情况。

使用INSERT [...] ON DUPLICATE KEY UPDATE [...]时,AUTO_INCREMENT键也会增加。

您可以解决问题

  1. 通过两个调用:一个用于检测id是否已存在的select,以及当id为null时仅调用insert
  2. 通过上面的两个语句为此创建一个过程,并从后端调用它。
  3. 您也可以重置表格的AUTO_INCREMENT值。这既不是一个好的做法,也不是一个快速的解决方案,将增加对简单任务的资源需求。我不建议考虑这一点。

答案 2 :(得分:0)

你可以通过更改我的sql的默认引擎来避免它,你可以在创建表时改变引擎:

create table if not exists category(BookId int(4) NOT NULL AUTO_INCREMENT,BookTitle varchar(50),PRIMARY KEY(BookId),UNIQUE(BookTitle)) ENGINE=MyISAM DEFAULT CHARSET=latin1;