Mysql 字段';id';不';你没有默认值吗?

Mysql 字段';id';不';你没有默认值吗?,mysql,insert,create-table,Mysql,Insert,Create Table,我不熟悉这个SQL;我在更大的项目中也看到过类似的问题,我现在还不明白。我正在为我的主页上使用的纸牌游戏制作一个数据库 我正在Windows上使用MySQL工作台。我得到的错误是: 错误代码:1364。字段“id”没有默认值 由于id是主键,因此不能有具有相同值的不同行。尝试更改表格,使id自动递增: id int NOT NULL AUTO_INCREMENT 然后按如下方式设置主键: PRIMARY KEY (id) 总而言之: CREATE TABLE card_games (

我不熟悉这个SQL;我在更大的项目中也看到过类似的问题,我现在还不明白。我正在为我的主页上使用的纸牌游戏制作一个数据库

我正在Windows上使用MySQL工作台。我得到的错误是:

错误代码:1364。字段“id”没有默认值


由于
id
是主键,因此不能有具有相同值的不同行。尝试更改表格,使
id
自动递增:

id int NOT NULL AUTO_INCREMENT
然后按如下方式设置主键:

PRIMARY KEY (id)
总而言之:

CREATE TABLE card_games (
   id int(11) NOT NULL AUTO_INCREMENT,
   nafnleiks varchar(50),
   leiklysing varchar(3000), 
   prentadi varchar(1500), 
   notkunarheimildir varchar(1000),
   upplysingar varchar(1000),
   ymislegt varchar(500),
   PRIMARY KEY (id));
否则,您可以在每次插入时指示
id
,注意每次设置不同的值:

insert into card_games (id, nafnleiks, leiklysing, prentadi, notkunarheimildir, upplysingar, ymislegt)

values(1, 'Svartipétur', 'Leiklýsingu vantar', 'Er prentað í: Þórarinn Guðmundsson (2010). Spilabókin - Allir helstu spilaleikir og spil.', 'Heimildir um notkun: Árni Sigurðsson (1951). Hátíðir og skemmtanir fyrir hundrað árum', 'Aðrar upplýsingar', 'ekkert hér sem stendur' );

确保没有为模型类中的主键定义setter

public class User{
@Id
@GeneratedValues
private int user_Id;
private String userName;

public int getUser_Id{
return user_Id;
}

public String getUserName{
return userName;
}

public void setUserName{
this.userName=userName;
}
}

自mysql 5.6以来,有一个新的默认值,确保显式插入表定义中未设置默认值的每个字段

要禁用并测试此功能:请参见此处的答案:

我建议您在不使用它的情况下进行测试,然后重新启用它,并确保您的所有表都具有默认值,这些字段不是在每个INSERT查询中显式传递的


如果第三方mysql查看器出现此错误,您可能仅限于该链接中的修复。

这是由于mysql具有严格的模式集,在模式没有默认值集的情况下,不允许使用带有空字段的INSERT或UPDATE命令

对此有几个修复方法

第一个“修复”是为您的模式分配一个默认值。这可以通过一个简单的ALTER命令完成:

ALTER TABLE `details` CHANGE COLUMN `delivery_address_id` `delivery_address_id` INT(11) NOT NULL DEFAULT 0 ;
然而,对于数据库模式中的许多表,这可能需要执行,这将很快变得单调乏味。第二个修复方法是删除mysql服务器上的sql\u模式STRICT\u TRANS\u表

如果您使用的是brew安装的MySQL,则应编辑MySQL目录中的my.cnf文件。更改底部的sql_模式:

#sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
sql_mode=NO_ENGINE_SUBSTITUTION
保存文件并重新启动Mysql


来源:

以下提到了两种解决方案:

解决方案1 MySQL最有可能出现在。尝试执行SQL查询
设置全局SQL\u模式=''
或编辑my.cnf/my.ini以确保未设置
STRICT\u ALL\u TABLES
和/或
STRICT\u TRANS\u TABLES

解决方案2 如果解决方案1不起作用,请按照以下步骤尝试解决方案2:

  • 以管理员身份运行MySQL管理员工具
  • 然后转到启动变量
  • 然后转到“预付款”选项卡
  • 找到SQL模式并删除
    STRICT\u ALL\u表
    和/或
    STRICT\u TRANS\u表
    ,然后单击应用更改
  • 重新启动MySQL服务器
  • 完成了

  • 注意:我已经在MySQL Server 5.7中测试了这些解决方案

    解决方案:从
    sql\u模式中删除
    STRICT\u TRANS\u表

    要检查默认设置

    mysql> set @@sql_mode = 
    'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select @@sql_mode;
    +----------------------------------------------------------------+
    | @@sql_mode                                                     |
    +----------------------------------------------------------------+
    | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
    +----------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    运行示例查询

    mysql> INSERT INTO nb (id) VALUES(3);
    ERROR 1364 (HY000): Field 'field' doesn't have a default value
    
    通过将
    STRICT\u TRANS\u表重置为null,删除该表

    mysql> set @@sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    现在,运行相同的测试查询

    mysql> INSERT INTO nb (id) VALUES(3);
    Query OK, 1 row affected, 1 warning (0.00 sec)
    

    来源:

    作为一名开发人员,强烈建议使用
    严格模式,因为它将允许您查看可能出现的问题/错误/警告,而不仅仅是通过关闭严格模式来解决。这也是更好的练习


    Strict模式是查看凌乱、草率代码的好工具

    id应设置为
    自动递增

    要将现有id列修改为自动增量,只需添加以下内容

    ALTER TABLE card_games MODIFY id int NOT NULL AUTO_INCREMENT;
    

    对我来说,当我改变时,问题得到了解决

    
    

    
    
    在我的
    Person.hbm.xml

    之后,我在另一个字段(mobno)中再次遇到相同的错误。我尝试重新启动我的IDE,重新创建带有上一个back问题的数据库,最终在我使用重新创建表时得到了修复(没有
    ENGINE=InnoDB DEFAULT CHARSET=latin1;
    并删除字段名中的下划线)

    而不是

    CREATE TABLE `tbl_person` (
      `person_id` bigint(20) NOT NULL,
      `person_nic` int(10) NOT NULL,
      `first_name` varchar(20) NOT NULL,
      `sur_name` varchar(20) NOT NULL,
      `person_email` varchar(20) NOT NULL,
      `person_password` varchar(512) NOT NULL,
      `mobno` varchar(10) NOT NULL DEFAULT '1',
      `role` varchar(10) NOT NULL,
      `verified` int(1) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    

    我可能认为这是因为使用了
    ENGINE=InnoDB DEFAULT CHARSET=latin1,因为我曾经得到错误
    org.hibernate.engine.jdbc.spi.SqlExceptionHelper-未知列'field list'
    中的'mob\u no',尽管它是我以前的列名,但在我的当前表中甚至不存在。即使在备份了数据库(使用修改过的列名,使用InnoDB引擎)之后,我仍然在使用旧的字段名时遇到相同的错误。这可能是由于该引擎中的缓存造成的。

    我与mariadb在AWS上遇到了一个问题-这就是我如何解决STRICT_TRANS_表问题的方法

    SSH连接到服务器并切换到ect目录

    [ec2-user]$ cd /etc
    
    备份我的.cnf

    [ec2-user etc]$ sudo cp -a my.cnf{,.strict.bak}
    
    我使用nano进行编辑,但还有其他的

    [ec2-user etc]$ sudo nano my.cnf
    
    在my.cnf文件中添加此行

    #
    #This removes STRICT_TRANS_TABLES
    #
    sql_mode=""
    
    然后退出并保存

    或者如果sql_模式是这样的:

    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
    
    改为

    sql_mode=""
    
    退出并保存

    然后重新启动数据库

    [ec2-user etc]$ sudo systemctl restart mariadb
    

    这对我来说太神奇了,因为解决字段“id”没有默认值?我已经尝试了这里给出的所有可能的方法

    set sql_mode=""
    set @@sql_mode = ''; etc
    
    但不幸的是,这些对我不起作用。 经过长时间的调查,我发现

    @Entity
    @Table(name="vendor_table")
    public class Customer {
        @Id
        @Column(name="cid")
        private int cid;
    .....
    }
    
    @Entity
    @Table(name="vendor_table")
    public class Vendor {
        @Id
        private int vid;
        @Column
        private String vname;
        .....
    }
    

    在这里,您可以看到两个表具有相同的名称。这是一个非常有趣的错误,是我犯的:))。更正此错误后,我的问题消失了。

    我遇到了错误,而ExecuteOnQuery()通过向表的主键添加AutoIncrement来解决此问题。在您的情况下,如果您不想添加主键,那么我们必须为主键赋值

    ALTER TABLE `t1` 
    CHANGE COLUMN `id` `id` INT(11) NOT NULL AUTO_INCREMENT ;
    

    为您的Id添加一个默认值,比如在表定义中,这将解决您的问题。

    我在2019年提出了这个问题。我的问题是用表2更新表1,忽略两个表中名称不同的变量。我得到的错误与问题中提到的相同:错误代码:1364。字段“id”在mysql中没有默认值。在这里
    @Entity
    @Table(name="vendor_table")
    public class Customer {
        @Id
        @Column(name="cid")
        private int cid;
    .....
    }
    
    @Entity
    @Table(name="vendor_table")
    public class Vendor {
        @Id
        private int vid;
        @Column
        private String vname;
        .....
    }
    
    ALTER TABLE `t1` 
    CHANGE COLUMN `id` `id` INT(11) NOT NULL AUTO_INCREMENT ;
    
    select @@sql_mode
    -- It will give something like:
    -- STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION