Sequelize 插入数据的时候没有自动自增id?

表结构:

{
    id: { type: DataTypes.INTEGER.UNSIGNED, autoIncrement: true, primaryKey: true, allowNull: false },
    enid: { type: DataTypes.STRING(100), unique: true, allowNull: false },
    name: { type: DataTypes.STRING(100), unique: true, allowNull: false },
    update_time: { type: DataTypes.DATE, defaultValue: DataTypes.NOW, allowNull: false },
    index: { type: DataTypes.TINYINT.UNSIGNED, defaultValue: 0, allowNull: false },
    pid: { type: DataTypes.INTEGER.UNSIGNED, allowNull: true },
    logo: { type: DataTypes.STRING(200), allowNull: true },
    view: { type: DataTypes.INTEGER.UNSIGNED, defaultValue: 0, allowNull: false },
    intro: { type: DataTypes.STRING(1000), allowNull: false },
}

同步到数据库后:
image.png

第一次插入数据正常:
image.png
image.png

插入第二条数据就会报错:
(数据: { enid: 'ddfffff', name: 'Ddfffff', index: 7, pid: null, intro: 'aaaaaaaaaaaaaaaaa' })
image.png

大佬们看看是哪里的问题??
第二次插入数据的时候如果添加id: 1,就能插入成功,否则失败!

阅读 1k
1 个回答

自增的数据是不需要专门声明的啊。我看了下我以前的sequelize项目:

// 严格模式
'use strict';
// 从sequelize模块选择性导入Model
const { Model } = require('sequelize');
// 模型导出
module.exports = (sequelize, DataTypes) => {
  class Prebook extends Model {
    // 用于定义关联的辅助方法,不是Sequelize生命周期的一部分,但models/index会自动调用此方法
    static associate(models) {

      /**
       * @外键
       * @资源实体id resourceId
       * @发起人id userId
       */

      // 仪器预约表-资源实体
      Prebook.belongsTo(models.Resource, {
        // 调用名称为“resource”
        as: 'resource',
        targetKey: 'id',
        foreignKey: {
          name: 'resourceId',
          allowNull: false,
        },
      });
      models.Resource.hasMany(Prebook, {
        // hasMany的话,习惯的调用名称为复数形式
        as: 'prebooks',
        sourceKey: 'id',
        foreignKey: {
          name: 'resourceId',
          allowNull: false,
        },
      });

      // 仪器预约表-发起人
      Prebook.belongsTo(models.User, {
        // 调用名称为“user”
        as: 'user',
        targetKey: 'id',
        foreignKey: {
          name: 'userId',
          allowNull: false,
        },
      });
      models.User.hasMany(Prebook, {
        // hasMany的话,习惯的调用名称为复数形式
        as: 'prebooks',
        sourceKey: 'id',
        foreignKey: {
          name: 'userId',
          allowNull: false,
        },
      });

    };
  };

  /**
   * 仪器预约表
   * @年月日时 time:DATE
   * @预约有效性 validity:BOOLEAN
   *   0:待审
   *   1:有效
   * 
   * @外键
   * @资源实体id resourceId
   * @发起人id userId
   */
  Prebook.init({
    time: {
      type: DataTypes.DATE,
      allowNull: false,
    },
    validity: {
      type: DataTypes.BOOLEAN,
      allowNull: false,
      defaultValue: 1,
    },
  }, {
    sequelize,
    // 模型名称为Prebook
    modelName: 'Prebook',
  });
  return Prebook;
};

就拿这张表来说,它是有默认的自增主键的,sequelize给的。不过在声明这张表的时候,自增主键是不写进去的。


另外,我后来用prisma了,简洁大方,效率高,还可以自己生成迁移,真的,回不来了。我用了prisma之后再也没用过sequelize。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题