【问题标题】:Field 'id' doesn't have a default value?字段“id”没有默认值?
【发布时间】:2014-11-09 23:40:38
【问题描述】:

我是这个 SQL 的新手;我在更大的程序中看到了类似的问题,目前我无法理解。我正在为我的主页中使用的纸牌游戏创建一个数据库。

我在 Windows 上使用 MySQL Workbench。我得到的错误是:

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

CREATE TABLE card_games
(
nafnleiks varchar(50), 
leiklysing varchar(3000), 
prentadi varchar(1500), 
notkunarheimildir varchar(1000), 
upplysingar varchar(1000), 
ymislegt varchar(500), 
id int(11) PK
);

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

values('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'
);

values('Handkurra',
'Leiklýsingu vantar',
'Er prentað í: Þórarinn Guðmundsson (2010). Spilabókin - Allir helstu spilaleikir og spil.',
'Heimildir um notkun', 
'Aðrar upplýsingar',
'ekkert her sem stendur'
);

values('Veiðimaður',
'Leiklýsingu vantar',
'Þórarinn Guðmundsson (2010). Spilabókin - Allir helstu spilaleikir og spil. Reykjavík: Bókafélagið. Bls. 19-20.',
'vantar',
'vantar',
'vantar'
);

【问题讨论】:

  • 也许您想用auto-increment 状态标记id 列?
  • id int(11) PK更改为id int(11) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id)

标签: mysql insert create-table


【解决方案1】:

由于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' );

【讨论】:

    【解决方案2】:

    以下有两种解决方案:

    解决方案 1

    MySQL 最有可能在STRICT SQL mode 中。尝试执行 SQL 查询 SET GLOBAL sql_mode='' 或编辑您的 my.cnf / my.ini 以确保您没有设置 STRICT_ALL_TABLES 和/或 STRICT_TRANS_TABLES

    解决方案 2

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

    1. 以管理员身份运行 MySQL 管理员工具
    2. 然后转到启动变量。
    3. 然后转到“高级”选项卡。
    4. 找到 SQL Mode 并删除 STRICT_ALL_TABLES 和/或 STRICT_TRANS_TABLES,然后单击 Apply Changes。
    5. 重启 MySQL 服务器。
    6. 完成。

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

    【讨论】:

    • 只是想补充一点,运行SELECT @@SQL_MODE, @@GLOBAL.SQL_MODE;可以看到当前设置的模式
    • 移除严格模式 - 不是解决方案。这是将来在脚下射击自己的好方法。这种模式可以防止错误,它就像是对不良做法和错误解决方案的保护,您只需将其删除即可。
    • 您可以使用SET @@SQL_MODE = REPLACE(@@SQL_MODE, 'STRICT_TRANS_TABLES', ''); 来取消设置。
    【解决方案3】:

    id 应该设置为auto-increment

    要将现有的 id 列修改为自动递增,只需添加此列

    ALTER TABLE card_games MODIFY id int NOT NULL AUTO_INCREMENT;
    

    【讨论】:

    • 为我工作。谢谢楼主!
    【解决方案4】:

    当 ExecuteNonQuery() 通过将 AutoIncrement 添加到我的表的主键来解决时,我遇到了错误。在您的情况下,如果您不想添加主键,那么我们必须需要为主键赋值。

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

    【讨论】:

      【解决方案5】:

      从 mysql 5.6 开始,有一个新的默认值可以确保您显式插入在表定义中没有设置默认值的每个字段。

      禁用和测试这个:在这里查看这个答案:mysql error 1364 Field doesn't have a default values

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

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

      【讨论】:

        【解决方案6】:

        这是由于 MySQL 设置了严格的模式,该模式不允许 INSERT 或 UPDATE 命令带有空字段,而模式没有设置默认值。

        对此有几个修复。

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

        ALTER TABLE `details` CHANGE COLUMN `delivery_address_id` `delivery_address_id` INT(11) NOT NULL DEFAULT 0 ;
        

        但是,这可能需要对数据库架构中的许多表执行此操作,这将很快变得乏味。第二个修复是删除mysql服务器上的sql_mode STRICT_TRANS_TABLES。

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

        #sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
        sql_mode=NO_ENGINE_SUBSTITUTION
        

        保存文件并重启Mysql。

        来源:https://www.euperia.com/development/mysql-fix-field-doesnt-default-value/1509

        【讨论】:

          【解决方案7】:

          确保您没有为模型类中的主键定义 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;
          }
          }
          

          【讨论】:

            【解决方案8】:

            解决方案:从sql_mode 中删除STRICT_TRANS_TABLES

            要检查您的默认设置,

            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_TRANS_TABLES 重置为 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)
            

            来源:https://netbeans.org/bugzilla/show_bug.cgi?id=190731

            【讨论】:

            • 检查默认设置:select @@sql_mode
            【解决方案9】:

            检测运行:

            select @@sql_mode
            -- It will give something like:
            -- STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
            

            要修复,运行:

            set global sql_mode = ''

            【讨论】:

              【解决方案10】:

              如果您将 AUTO_INCREMENT 子句添加到数据库表中的主键 id 字段,如下所示,它将起作用。

              创建表user_role ( user_role_id bigint NOT NULL AUTO_INCREMENT, user_id bigint 非空, role_id bigint 非空,

              【讨论】:

                【解决方案11】:

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

                <id name="personID" column="person_id">
                    <generator class="native"/>
                </id>
                

                <id name="personID" column="person_id">
                    <generator class="increment"/>
                </id>
                

                在我的Person.hbm.xml.

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

                CREATE TABLE `tbl_customers` (
                  `pid` bigint(20) NOT NULL,
                  `title` varchar(4) NOT NULL,
                  `dob` varchar(10) NOT NULL,
                  `address` varchar(100) NOT NULL,
                  `country` varchar(4) DEFAULT NULL,
                  `hometp` int(12) NOT NULL,
                  `worktp` int(12) NOT NULL,
                  `mobno` varchar(12) NOT NULL,
                  `btcfrom` varchar(8) NOT NULL,
                  `btcto` varchar(8) NOT NULL,
                  `mmname` varchar(20) NOT NULL
                )
                

                而不是

                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 - Unknown column 'mob_no' in 'field list' 即使它是我以前的列名,甚至在我当前的表中都不存在。即使在备份数据库(修改列名,使用 InnoDB 引擎)之后,我仍然遇到与旧字段名相同的错误。这可能是由于该引擎中的缓存。

                【讨论】:

                  【解决方案12】:

                  我在 2019 年提出了这个问题。我的问题是用 table2 更新 table1 忽略两个表中具有不同名称的变量。我遇到了与问题中提到的相同的错误:错误代码:1364。字段 'id' 在 mysql 中没有默认值。以下是解决方法:

                  表 1 架构:id(唯一且自动递增)|姓名 |简介 |年龄 表2 Schema:motherage|父亲|姓名|简介

                  这解决了我的错误: INSERT IGNORE INTO table2 (name,profile) SELECT name, profile FROM table1

                  【讨论】:

                    【解决方案13】:

                    禁用 FOREIGN_KEY_CHECKS 然后

                    `SET FOREIGN_KEY_CHECKS = 0;

                    ALTER TABLE card_games MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT;

                    SET FOREIGN_KEY_CHECKS = 1;`

                    【讨论】:

                      【解决方案14】:

                      强烈建议作为开发人员使用STRICT 模式,因为它可以让您查看可能出现的问题/错误/警告,而不是通过关闭严格模式来解决它。这也是更好的做法。

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

                      【讨论】:

                      • 这不是一个答案,但可能是对建议删除 STRICT 模式的其他答案的评论
                      【解决方案15】:

                      我在 AWS 上遇到了 mariadb 问题 - 这就是我解决 STRICT_TRANS_TABLES 问题的方法

                      SSH 进入服务器并切换到 ect 目录

                      [ec2-user]$ cd /etc
                      

                      备份 my.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_mode 是这样的:

                      sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
                      

                      改成

                      sql_mode=""
                      

                      退出并保存

                      然后重启数据库

                      [ec2-user etc]$ sudo systemctl restart mariadb
                      

                      【讨论】:

                        【解决方案16】:

                        这对我来说太棒了,解决字段'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;
                            .....
                        }
                        

                        在这里您可以看到两个表具有相同的名称。这是一个非常有趣的错误,是我做的:))))。改正后,我的问题就解决了。

                        【讨论】:

                          【解决方案17】:

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

                          【讨论】:

                          • 如果您提供带有解释的查询 sn-p 会更好
                          猜你喜欢
                          • 2015-07-19
                          • 2018-07-31
                          • 2010-10-22
                          • 1970-01-01
                          • 2020-09-14
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多