mysql 如何修复SequelizeDatabaseError:字段“id”没有默认值?

eqqqjvef  于 2023-08-02  发布在  Mysql
关注(0)|答案(4)|浏览(260)

我正在使用MVC节点express pug和sequelize作为ORM和视图部分,我用pug做了一个待办事项列表,所以当我开始我的应用程序工作正常,但当我试图创建一个新的项目时,这个项目已经插入到数据库中,出现错误1364
原则上这是一个个人项目添加到我的投资组合,我看到有一个可能的解决方案,通过停用严格的SQL模式,但我想知道是否有另一个解决方案

model code Proyect.js

const Sequelize = require('sequelize');
//conect db
const db = require('../config/db');

const Proyects = db.define('proyects', {
    id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true,
        allowNull: false
       },
    name: Sequelize.STRING,
    url: Sequelize.STRING
     });
module.exports = Proyects;

字符串
我希望用这个模型在我的表中创建一个寄存器,但当我尝试实际错误时,它是下一个

Executing (default): CREATE TABLE IF NOT EXISTS `proyects` (`id` INTEGER NOT NULL auto_increment , `name` VARCHAR(255), `url` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
Executing (default): SHOW INDEX FROM `proyects`
conected to db
Executing (default): INSERT INTO `proyects` (`id`,`createdAt`,`updatedAt`) VALUES (DEFAULT,?,?);
{ SequelizeDatabaseError: Field 'id' doesn't have a default value
  code: 'ER_NO_DEFAULT_FOR_FIELD',
     errno: 1364,
     sqlState: 'HY000',
     sqlMessage: 'Field \'id\' doesn\'t have a default value',
     sql:
      'INSERT INTO `proyects` (`id`,`createdAt`,`updatedAt`) VALUES (DEFAULT,?,?);' },

htrmnn0y

htrmnn0y1#

据我所知,这是MySQL数据库的问题。表中的“id”字段被标记为非空,并且在插入值时,您没有为“id”字段提供任何值。
您可以避免面对此错误,要么在'id'字段中允许空值,要么在创建表时提供默认值(您可以使用defaultValue标志)。否则,你已经有了一个替代的解决方案。

efzxgjgh

efzxgjgh2#

我最初得到这个错误是因为我拼错了autoIncrement。为了解决这个问题,我在应用正确的拼写后使用了如下的{force:true},一旦问题消失,就从sync()方法中删除了它。我永远不会在生产部署中使用{force:true},因为它会删除表(并删除所有记录)。
在app.js中,调用sync方法如下

sequelize.sync({force:true})
    .then(result => {
        //console.log(result);
        app.listen(3000);
    })
    .catch(err => {
        console.log(err);
    });

字符串

swvgeqrz

swvgeqrz3#

你可以安装uuid npm install uuid然后const uuid = require('uuid')在任何你想要的地方使用它例如id:uuid.v4()

pjngdqdw

pjngdqdw4#

内部异常:java.sql.SQLException:字段“Id”没有默认值。
此问题已解决。在我的情况下,这是一个配置错误的问题。
glassfish-resources.xml中,我有这个指向测试数据库的设置:

jdbc-resource enabled="true"
jndi-name="jdbc/MBS"
object-type="user"
pool-name="mysql_mbs_mbsPool"

字符串
但在Payara Console中,我有一个指向另一个数据库的配置。

JNDI Name: jdbc/MBS
Pool Name: mysql_mbsprod_adminPool


我认为这种错误配置会导致Auto_Increment下一个值不匹配,从而导致了这个问题。我想这和你说的序列号有时会被重置是一样的。

SELECT table_name, Auto_increment

FROM information_schema.tables

WHERE table_name = 'Log'


在控制台中更改Pool Name以与glassfish-resource.xml中的pool-name匹配并且它们指向相同的数据库后,解决问题。

相关问题