【问题标题】:on duplicate key update results in a high index key重复键更新导致高索引键
【发布时间】:2014-04-22 15:00:32
【问题描述】:

所以我在登录时使用 ON DUPLICATE KEY UPDATE - 我在每次登录时都使用它,因为我从外部页面获取数据并且用户只能在那里更新他们的设置。那是因为该页面上的软件缺少 api。

实际上我正在使用这个查询来更新他们的设置。如果该帐户未在我的数据库中列出,则会在成功时使用其凭据创建。

我的问题是,如果用户未在我的数据库中列出并将他们插入其中,则他们的 id(自动增量)不是 1、2、3、4 等等。它从 32 开始,然后到 54,然后是 185,依此类推。 ID 升得如此之快。这是我的查询中的问题还是实际上是一个错误?

http://puu.sh/8iXv7.png

这是我的问题

mysqli_query($database, "   INSERT INTO `benutzer` (`id`, `login`, `vorname`, `nachname`, `gruppen`, `email`, `adresse`, `telefon`, `telefon2`, `telefon3`, `bemerkungen`)
            VALUES (NULL, '".$userdata[0]."', '".$userdata[1]."', '".$userdata[2]."', '".implode(";", $gruppen)."', '".$userdata[3]."', '".$userdata[4]."', '".$userdata[5]."', '".$userdata[6]."', '".$userdata[7]."', '".$userdata[8]."')
            ON DUPLICATE KEY UPDATE `vorname` = '".$userdata[1]."', `nachname` = '".$userdata[2]."', `gruppen` = '".implode(";", $gruppen)."', `email` = '".$userdata[3]."', `adresse` = '".$userdata[4]."', `telefon` = '".$userdata[5]."', `telefon2` = '".$userdata[6]."', `telefon3` = '".$userdata[7]."', `bemerkungen` = '".$userdata[8]."'") or die(mysql_error());

这是表格的结构

CREATE TABLE IF NOT EXISTS `benutzer` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`login` varchar(32) NOT NULL,
`vorname` text NOT NULL,
`nachname` text NOT NULL,
`gruppen` text NOT NULL,
`email` text NOT NULL,
`adresse` text NOT NULL,
`telefon` text NOT NULL,
`telefon2` text NOT NULL,
`telefon3` text NOT NULL,
`bemerkungen` text NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `login` (`login`),
KEY `login_2` (`login`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=32 ;

提前致谢

【问题讨论】:

  • 如果您不使用 ON DUPLICATE KEY UPDATE,您是否观察到相同的行为?了解您是否已明确将范围缩小到该功能可能会很有用。
  • 另外,您能否发出SHOW VARIABLES LIKE 'auto_increment_increment' 并检查它报告的值为1
  • @Hammerite,不,如果我首先检查是否有使用该用户名的登录名,如果没有,则执行单个查询,它可以完美运行。所以当我使用两个查询时它可以工作。 “auto_increment_increment”为 1
  • login 列上有两个键。您可以删除 login_2 索引。

标签: php mysql sql


【解决方案1】:

这是预期和记录的行为。 如果您不喜欢它 - 请不要将工具用于错误的目的。

但是,我根本不会称之为问题。 Id 是一个抽象标识符,最长可达 40 亿,应该对每个人都足够

【讨论】:

    猜你喜欢
    • 2015-01-24
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 2016-06-28
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    相关资源
    最近更新 更多