gpt4 book ai didi

node.js - 发生重复键错误时,Postgres 自动递增

转载 作者:行者123 更新时间:2023-12-03 22:27:01 25 4
gpt4 key购买 nike

我定义了一个模型和迁移:

module.exports = (sequelize, DataTypes) => {
const user = sequelize.define('user', {
name: DataTypes.STRING,
username: DataTypes.STRING,
email: DataTypes.STRING,
password: DataTypes.STRING,
},
{})

user.associate = function (models) {
// associations can be defined here
}

return user

}
'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('users', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
name: {
allowNull: false,
type: Sequelize.STRING
},
username: {
unique: true,
allowNull: false,
type: Sequelize.STRING
},
email: {
allowNull: false,
type: Sequelize.STRING
},
password: {
allowNull: false,
type: Sequelize.STRING
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('users');
}
};

当我尝试创建一个具有重复键值(在本例中为电子邮件或用户名)的新用户 user.create({...}) 时,sequelizes 会按预期抛出错误,即使如此它也会增加主键自动增量值。

示例:我创建了一个具有 id 1 的新用户,然后我尝试创建 5 次具有重复唯一键(用户名或电子邮件)的新用户,然后当我成功创建用户时,主键 id 变为 6。

为什么会发生这种情况?正确的是按照顺序,如果错误则不增加,只有在用户成功插入时才增加。

最佳答案

我认为值是由序列生成的。

那么这是所有 DBMS 中序列的正常行为。

想象一下下面的场景。

  • User 1 要求一个新的 ID。他得到 id = 1
  • User 2 要求一个新的 ID。他得到 id = 2
  • User 1 无法在依赖表中插入记录。他执行 rollback
  • User 2 成功插入他需要的每一个。他执行 commit

  • 现在想象一下用序列重用 id = 1 需要什么,因为它没有被提交。
  • 将序列回滚到 1 ?复杂,因为它需要记住它将 id = 2 返回给另一个用户。
  • id=1 替换用户 2 插入的内容?由于外键昂贵且有风险(User 2 可能会使用将 id=2 映射到内存中某个对象的软件,更改 DB 中的 id 为时已晚)
  • 让用户 2 等待直到用户 1 提交或回滚他的事务 才知道返回什么?每个人都会一直在等待。

  • 最重要的是,在 id 中插入具有连续值的记录仍然不足以让 保持 连续。表上的第一个 delete 会将其全部分解。

    结论 :确保 id 连续的成本对于数据库性能来说是疯狂的,并且该值是不存在的,因为它可以随时崩溃。

    关于node.js - 发生重复键错误时,Postgres 自动递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54527850/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com