【问题标题】:mysql table AUTO increment keeps incrementing in steps of instead of 1. Like 41,51,61mysql 表 AUTO 增量不断递增,而不是 1。像 41、51、61
【发布时间】:2020-05-22 10:34:56
【问题描述】:

即使在删除表中的所有行后继续。它从最后插入的 id 继续添加。 我用它来创建我的表

app.get('/createuserstable', (req, res) => {
    let sql = 'CREATE TABLE Users(id int AUTO_INCREMENT, name VARCHAR(255), username VARCHAR(255), email VARCHAR(255), PRIMARY KEY (id))';
    db.query(sql, (err, result) => {
        if (err) throw err;
        console.log(result);
        res.send('Users table created....');
    });
});

使用注册路线添加用户,并以 10 步递增

app.post('/signup', (req, res) => {
    let user = { name: req.body.name, username: req.body.username, email: req.body.email };
    db.query('INSERT INTO users SET?', user, (error, result) => {
        if (error) throw error;
        res.status(201).send(`User added with ID: ${result.insertId}`);
    });
});

这是使用 10 行 json 数据的代码

app.get('/populate', (req, res) => {
    request({
        url: "http://jsonplaceholder.typicode.com/users",
        json: true
    }, (err, resp, body) => {
        //res.send(typeof body);
        for (var i = 0; i < body.length; i++) {

            let post = { id: body[i].id, name: body[i].name, username: body[i].username, email: body[i].email };
            let sql = 'INSERT INTO users SET?';
            let query = db.query(sql, post, (err, result) => {
                if (err) throw err;
                console.log(result);
            });
        };
        res.send('users data added....')
    });

});

【问题讨论】:

  • 我假设您确实检查了 pypMyAdmin 中的实际表或其他内容?您能否确认这些 ID 实际上未使用,即该表在 41 和 51 之间没有任何行?
  • 除非您无意中拨弄了auto_increment_increment,否则这可能是预期的行为。
  • 回到@ÁlvaroGonzález 的想法,SHOW VARIABLES LIKE 'auto_inc%'; 的结果是什么?
  • AFAIK 这可以为每个会话设置,因此您可以根据SET @@auto_increment_increment=1; 为新连接设置它。但是,如果您正在与其他人一起处理更大的代码库,我会首先 grep 如果它出于某种原因将其设置为 10,并且如果您不是数据库管理员,是否会先询问他/她,因为可能有原因这个步长。
  • 感谢你们@SebastianB 的帮助。和克里斯格。有人告诉我 cleardb(我正在使用的数据库)按照你所说的 sebastian 的方式配置它。

标签: javascript mysql sql node.js


【解决方案1】:

您已将auto_increment_increment 系统变量从默认值1 增加到10。它的范围是全局,会话,因此您可以为当前会话设置它或为整个服务器更改它(第一个选项在 MySQL/8.0.18 之前被限制)。

如果您根本不需要它,我建议您在设置文件中找到该指令并将其注释掉。

【讨论】:

    【解决方案2】:

    这是 MySQL 的正常行为并且通常是有意的,因此 ID 永远不会被重复使用,即使对于已删除的记录也是如此。

    如果您确实需要重置自增计数器,您可以:

    • 使用TRUNCATE TABLE users 一次清空整个表
    • 使用DROP TABLE users / CREATE TABLE users ... 删除并重新创建表
    • ALTER TABLE users AUTO_INCREMENT = 1;

    另见https://www.mysqltutorial.org/mysql-reset-auto-increment/

    【讨论】:

    • 我不认为这与重置计数器有关; OP 说新的 ID 相隔十个而不是连续的数字。
    • 好的,但是以 10 为步骤添加它的问题呢。如果最后一个 id 是 41,下一个添加的 id 是 51。我认为这与我如何添加前 10 个有关来自 json api 的带有 for 循环的行。
    • @ChrisG 我监督了这一点。我的回答至少回答了问题的第一部分(“即使在删除表中的所有行之后继续。它继续从最后插入的 id 添加”)。但你是对的,我的分析器无法解释每个连续插入的增量 10。但我不确定 OP 是否真的观察到 ID 增加了 10,或者 OP 是否表达自己只是不准确。
    • 好的@PreshyJones,你要插入什么库(db)?
    • 好吧,我不太习惯后端 ATM。检查文档以确保没有因某种原因触发的神奇“批量插入”,但查询语法正确且 user 对象足够简单。您确定只调用一次处理程序吗?您是否进行了一些日志记录/调试?正如@ChrisG 所写,这是最可能的原因。
    猜你喜欢
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    相关资源
    最近更新 更多