[英]Field 'id' doesn't have a default value?
我是这个 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'
);
由于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个解决方案:
MySQL 很可能处于STRICT SQL 模式。 尝试执行 SQL 查询SET GLOBAL sql_mode=''
或编辑您的 my.cnf / my.ini 以确保您没有设置STRICT_ALL_TABLES
和/或STRICT_TRANS_TABLES
。
如果解决方案 1 不起作用,请按照以下步骤尝试解决方案 2:
STRICT_ALL_TABLES
和/或STRICT_TRANS_TABLES
,然后单击 Apply Changes。注意:我已经在 MySQL Server 5.7 中测试过这些解决方案
id 应设置为auto-increment
。
要将现有的 id 列修改为自动递增,只需添加此
ALTER TABLE card_games MODIFY id int NOT NULL AUTO_INCREMENT;
当 ExecuteNonQuery() 通过将 AutoIncrement 添加到我的表的主键来解决时,我遇到了错误。 在您的情况下,如果您不想添加主键,那么我们必须需要为主键赋值。
ALTER TABLE `t1`
CHANGE COLUMN `id` `id` INT(11) NOT NULL AUTO_INCREMENT ;
从 mysql 5.6 开始,有一个新的默认值可确保您明确插入在表定义中没有设置默认值的每个字段。
禁用和测试这个:在这里看到这个答案: mysql error 1364 Field doesn't have a default values
我建议您在没有它的情况下进行测试,然后重新启用它并确保您的所有表都具有您未在每个 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_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
确保您没有为模型类中的主键定义 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;
}
}
要检测运行:
select @@sql_mode
-- It will give something like:
-- STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
要修复,请运行:
set global sql_mode = ''
如果您将 AUTO_INCREMENT 子句添加到数据库表中的主键 id 字段,如下所示,它将起作用。
创建表user_role
( user_role_id
bigint NOT NULL AUTO_INCREMENT, user_id
bigint NOT NULL, role_id
bigint NOT NULL,
解决方案:从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
。
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
对我来说,当我改变时问题得到了解决
<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 引擎)之后,我仍然遇到与旧字段名相同的错误。 这可能是由于该引擎中的缓存。
我在 2019 年提出了这个问题。我的问题是用 table2 更新 table1 忽略两个表中具有不同名称的变量。 我遇到了与问题中提到的相同的错误:错误代码:1364。字段'id'在mysql中没有默认值。 以下是解决方法:
表 1 Schema : id (unique & auto increment)| 姓名 | 简介 | 年龄表2 Schema:motherage| 父亲| 姓名| 轮廓
这解决了我的错误: INSERT IGNORE INTO table2 (name,profile) SELECT name, profile FROM table1
禁用 FOREIGN_KEY_CHECKS 然后
`SET FOREIGN_KEY_CHECKS = 0;
ALTER TABLE card_games MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT;
设置 FOREIGN_KEY_CHECKS = 1;`
作为开发人员,强烈建议使用STRICT
模式,因为它可以让您查看可能出现的问题/错误/警告,而不仅仅是通过关闭严格模式来解决它。 这也是更好的做法。
严格模式是查看凌乱、草率代码的好工具。
我在 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
对我来说太神奇了,解决Field '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;
.....
}
在这里您可以看到两个表具有相同的名称。 这是一个非常有趣的错误,是我做的:))))。 改正后,我的问题就解决了。
为您的 Id 添加一个默认值让我们在您的表定义中说这将解决您的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.