这是我的表:
CREATE TABLE `files` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`filename` varchar(255) NOT NULL,
`hash` varchar(255) NOT NULL,
`path` varchar(255) NOT NULL,
`mimetype` varchar(255) NOT NULL,
`size` int(10) unsigned NOT NULL,
`uploaded` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `filename` (`filename`,`hash`)
)
假设我插入了一些文件名为“myFile”和hash“abc”的内容。假设它不是重复的,它的id是45。
然后让我说我插入一些更多的查询,以便auto_increment索引现在更高。为了这个例子,我们会说它是70。
现在当我这样做时会发生什么:
insert into files(filename, hash, ...) values ("myFile", "abc", ...) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);
实际发生了什么?它会更新我当前插入的文件的ID为45吗?或者它会将现有行的ID更改为70?在前者的情况下是否意味着旧行被写了?在后一种情况下,它如何知道使用45?
答案 0 :(得分:0)
如果(filename,hash)都不匹配,则IODKU语句将像
一样insert into files(filename, hash, ...) values ("myFile", "abc", ...)`
您之后的SELECT last_insert_id
将获得新ID。
否则它将进行大多数无操作更新。您的SET
仅包含id=LAST_INSERT_ID(id)
,不更改ID。但是,它会捕获id
(45)的现有值,以便后续的SELECT last_insert_id
获得该值。
因此,无论哪种方式,您都会获得该行的ID,无论是INSERTed还是UPDATEd。
(是的,语法有点像kludgy。)