【问题标题】:PHP MySQL AUTO_INCREMENT with INSERT INTO .. ON DUPLICATE KEYPHP MySQL AUTO_INCREMENT 与 INSERT INTO .. ON DUPLICATE KEY
【发布时间】:2017-09-01 05:38:29
【问题描述】:

我已经搜索了几天的答案,但我似乎无法找到正确的解决方案。因此,我提出以下问题:

假设我有一个表,其中有一列 ID 是一个 AUTO_INCREMENT 字段,而一列 Word 是唯一的。我运行以下查询:

"INSERT IGNORE INTO Table (Word) VALUES('Test')"
"INSERT IGNORE INTO Table (Word) VALUES('Test1')"
"INSERT IGNORE INTO Table (Word) VALUES('Test2')"
"INSERT IGNORE INTO Table (Word) VALUES('Test')" //THIS ONE WILL BE IGNORED

问题是我无法从最后一个查询中得到最后一个$mysqli->insert_id,因为它没有插入任何东西。但是我需要这个已经在数据库中的 ID。因此,我认为我应该使用 ON DUPLICATE KEY UPDATE 语句,但这会导致 AUTO_INCREMENT 跳过值的情况,因为它会更新值,但 ALSO 会增加 AUTO_INCREMENT 值,尽管此值不是t 分配给任何行。

所以最后,我得到了一张这样的表格:

ID |Word
1  |Test
2  |Test1
3  |Test2
//Trying to insert words that where already in the table..
12 |Test3
//Trying to insert words that where already in the table..
17 |Test4

【问题讨论】:

  • 为什么这很重要?
  • 我认为这是 stackoverflow.com/a/6291568/1625955 的副本,也许有帮助。
  • @NiettheDarkAbsol,因为我有很多行得到 IGNORE 或 DUPLICATE UPDATE 并且我的整数因此而大幅增长。因此,我得到非常大的整数,可能会小得多(超过 1000 倍,这就是为什么)
  • @Jens,感谢您的链接。但是,我正在执行的语句已经在事务中。因此,这对我来说不是最佳解决方案,因为我需要另一笔交易?
  • 无论如何,整数总是 4 字节,你有 40 亿的空间。如果这还不够,请使用BIGINT。但实际上你不需要它。

标签: php mysql auto-increment mysql-insert-id


【解决方案1】:

我的回答是首先从表中检索单词的 id,并且只有当它无法插入它时。在这两种情况下,您都已准备好 id。

我的猜测也是这样会更快,因为您没有在 mysql 中创建任何被忽略的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 2022-08-02
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2010-10-07
    相关资源
    最近更新 更多