一些注意事项:我使用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问题)。 谢谢你们的建议。我很欣赏。
答案 0 :(得分:0)
您不应在插入中使用任何与标题相关的检查(不使用id:s)。如果您插入两本标题相同的书,那就行不通。
常用方式如下:
$mysqli->insert_id
完成)租赁/借款人也应该拥有自己的ID字段。然后只需将这些ID链接到租赁表中即可。
答案 1 :(得分:0)
使用INSERT IGNORE
时,会忽略重复键之类的错误。 AUTO_INCREMENT
键(表的主键)会增加,但是你无法避免这种情况。
使用INSERT [...] ON DUPLICATE KEY UPDATE [...]
时,AUTO_INCREMENT
键也会增加。
您可以解决问题
null
时仅调用insert 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;