您所要做的就是将您的表更改为使用 MyISAM 引擎。但请注意,MyISAM 不支持事务和外键。
无论如何,这是一个如何工作的示例(引用手册):
对于 MyISAM 和 BDB 表,您可以在多列索引中的辅助列上指定 AUTO_INCREMENT。在这种情况下,AUTO_INCREMENT 列的生成值计算为 MAX(auto_increment_column) + 1 WHERE prefix=given-prefix。当您要将数据放入有序组时,这很有用。
CREATE TABLE animals (
grp ENUM('fish','mammal','bird') NOT NULL,
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (grp,id)
) ENGINE=MyISAM;
INSERT INTO animals (grp,name) VALUES
('mammal','dog'),('mammal','cat'),
('bird','penguin'),('fish','lax'),('mammal','whale'),
('bird','ostrich');
SELECT * FROM animals ORDER BY grp,id;
返回:
+--------+----+---------+
| grp | id | name |
+--------+----+---------+
| fish | 1 | lax |
| mammal | 1 | dog |
| mammal | 2 | cat |
| mammal | 3 | whale |
| bird | 1 | penguin |
| bird | 2 | ostrich |
+--------+----+---------+
在这种情况下(当 AUTO_INCREMENT 列是多列索引的一部分时),如果您删除任何组中具有最大 AUTO_INCREMENT 值的行,则会重用 AUTO_INCREMENT 值。即使对于 MyISAM 表也会发生这种情况,因为 AUTO_INCREMENT 值通常不会被重用。
如果 AUTO_INCREMENT 列是多个索引的一部分,MySQL 将使用以 AUTO_INCREMENT 列开头的索引生成序列值,如果有的话。例如,如果动物表包含索引 PRIMARY KEY (grp, id) 和 INDEX (id),MySQL 将忽略 PRIMARY KEY 以生成序列值。结果,该表将包含单个序列,而不是每个 grp 值的序列。
如您所见,您的主键和 auto_increment 设置已经正确。只需更改为 MyISAM。
如果不想用MyISAM,也可以边选边计算。
SELECT
ip.*,
@row := IF(@prev_inv != invoice_id, 1, @row + 1) AS `row`,
@prev_inv := invoice_id
FROM invoice_products ip
, (SELECT @row:=1, @prev_inv:=NULL) vars
ORDER BY invoice_id
第三种可能性当然是在数据库之外进行计算。我会留给你的:)