Mysql 字段';id';不';你没有默认值吗?
我不熟悉这个SQL;我在更大的项目中也看到过类似的问题,我现在还不明白。我正在为我的主页上使用的纸牌游戏制作一个数据库 我正在Windows上使用MySQL工作台。我得到的错误是: 错误代码:1364。字段“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 (
由于
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:
STRICT\u ALL\u表
和/或STRICT\u TRANS\u表
,然后单击应用更改注意:我已经在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