【问题标题】:(using MySQL insert) can't find the id of record when it exists(使用 MySQL 插入)存在时找不到记录的 id
【发布时间】:2012-01-11 20:44:41
【问题描述】:

我使用 PHP 在 MySQL 数据库中插入一条记录。如果记录是新的,我会得到 insert_id,但如果它已经存在,我无法使用单个查询获取 id。

以下两个查询都允许我添加记录,如果它已经存在则跳过:

INSERT INTO `emails` (`email`) VALUE ('abc@example.com') ON DUPLICATE KEY UPDATE `id`=`id`

INSERT IGNORE INTO `emails` (`email`) VALUE ('abc@example.com')

在这两种情况下获得正确结果的正确方法是什么?

编辑:这是我的表格语法:

CREATE TABLE `emails` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `email` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

【问题讨论】:

    标签: php mysql insert


    【解决方案1】:

    我怀疑是 LAST_INSERT_ID 的值最终出现在 insert_id 中。

    引用自 MySQL 手册;

    要使 LAST_INSERT_ID() 对更新有意义,请按如下方式插入行:

    INSERT INTO table (a,b,c) VALUES (1,2,3)
      ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;
    

    来源:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

    【讨论】:

    • 这仅在数据实际更新时才有效。如果没有数据改变,他和以前一样。
    • 我喜欢这个答案除了我们需要知道这个应用程序的目的是什么。例如,如果是用户注册,更改id 可能会导致大问题(即,在尝试插入任何内容并更改现有数据之前,应该检查电子邮件地址是否存在)。不过,因为我学到了一些东西,+1 :)
    • 谢谢,但我应该同意 msanford。
    • @webbiedave 即使删除了“c=3”,上面的行也会正确设置 LAST_INSERT_ID,即。除了 id 设置为自身之外,什么都不会更新。
    • 不,使用 InnoDB,您会得到 ID 序列中的漏洞。这是因为 InnoDB 将为永远不会发生的插入分配一个 id,并且 InnoDB 从不重用分配的 id。这与启动事务、执行常规插入和回滚完全相同的行为。序列中的漏洞是个问题吗?
    猜你喜欢
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多