向我详细解释last_insert_id(expr)的作用

时间:2015-02-28 06:00:18

标签: mysql

这是我的表:

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?

1 个答案:

答案 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。)