我有这样的表结构
当我向表中插入行时,我正在使用此查询:
INSERT INTO table_blah ( material_item, ... hidden ) VALUES ( data, ... data ) ON DUPLICATE KEY UPDATE id = id, material_item = data, ... hidden = data;
当我第一次插入数据而不触发ON DUPLICATE KEY
id增量罚款:
但是当ON DUPLICATE KEY
触发器和我插入新行时,id看起来很奇怪:
auto increment
即使触发,我怎样才能保持正确的增量ON DUPLICATE KEY
?
我已经使用mySQL单独找到了一些答案,但是我希望有人可以告诉我在使用PHP处理插入/更新时获取mysql DB的最后一行或更新行的ID的方法.
目前我有这样的东西,其中column3是一个唯一的键,并且还有一个id列,它是一个自动增量的主键:
$query ="INSERT INTO TABLE (column1, column2, column3) VALUES (value1, value2, value3) ON DUPLICATE KEY UPDATE SET column1=value1, column2=value2, column3=value3";
mysql_query($query);
$my_id = mysql_insert_id();
Run Code Online (Sandbox Code Playgroud)
INSERT上的$ my_id是正确的,但是当它更新一行时(ON DUPLICATE KEY UPDATE)不正确.
我看过几篇帖子,人们建议你使用类似的东西
INSERT INTO table (a) VALUES (0) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id)
Run Code Online (Sandbox Code Playgroud)
在调用ON DUPLICATE KEY时获取有效的ID值 - 但这会将该有效ID返回给PHP mysql_insert_id()
函数吗?
我已经看到很多解释为什么mysql跳过一些自动增量值(并且它不是一个bug,因为mysql从不声明它们应该是连续的).我不确定为什么它们中的任何一个适用于这个简单的测试用例.我不知道所有最新版本的mysql的结果是否相同.还添加:
ALTER TABLE test_table2 AUTO_INCREMENT = 1;
Run Code Online (Sandbox Code Playgroud)
两个INSERT INTO test_table2行之间的顺序如下所示.
有谁知道为什么这个简单的案例会跳过ID 6和7?
CREATE TABLE test_table1 (
`id` INT NOT NULL AUTO_INCREMENT,
`test` TEXT NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO test_table1(`test`) VALUES('value 1');
INSERT INTO test_table1(`test`) VALUES('value 2');
INSERT INTO test_table1(`test`) VALUES('value 3');
INSERT INTO test_table1(`test`) VALUES('value 4');
INSERT INTO test_table1(`test`) VALUES('value 5');
CREATE TABLE test_table2 (
`id` INT NOT NULL AUTO_INCREMENT,
`test` TEXT NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO test_table2(`test`) SELECT `test` FROM test_table1;
INSERT INTO …
Run Code Online (Sandbox Code Playgroud)