我是这个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'
);
答案 0 :(得分:32)
下面提到了两种解决方案:
MySQL最有可能出现在STRICT SQL mode中。尝试执行SQL查询SET GLOBAL sql_mode=''
或编辑my.cnf / my.ini以确保您没有设置STRICT_ALL_TABLES
和/或STRICT_TRANS_TABLES
。
如果Solution-1不起作用,请尝试按以下步骤给出的Solution-2:
STRICT_ALL_TABLES
和/或STRICT_TRANS_TABLES
,然后点击“应用更改”。注意:我在MySQL Server 5.7中测试了这些解决方案
答案 1 :(得分:28)
由于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 :(得分:17)
ID应设为auto-increment
。
要将现有的id列修改为自动递增,只需添加此
即可ALTER TABLE card_games MODIFY id int NOT NULL AUTO_INCREMENT;
答案 3 :(得分:3)
确保您没有为模型类中的主键定义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;
}
}
答案 4 :(得分:3)
从mysql 5.6开始,有一个新的默认值,可以确保显式插入在表定义中没有设置默认值的每个字段。
要停用并测试此功能:请在此处查看此答案:mysql error 1364 Field doesn't have a default values
我建议您在没有它的情况下进行测试,然后重新启用它并确保所有表都具有您未在每个INSERT查询中显式传递的字段的默认值。
如果第三方mysql查看器发出此错误,您可能仅限于该链接中的修复。
答案 5 :(得分:2)
如果将 AUTO_INCREMENT 子句添加到数据库表中的主键 id 字段,如下所示,它将起作用。
创建表 user_role
(
user_role_id
bigint NOT NULL AUTO_INCREMENT,
user_id
bigint NOT NULL,
role_id
bigint NOT NULL,
答案 6 :(得分:2)
解决方案:从STRICT_TRANS_TABLES
sql_mode
要检查默认设置,
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)
答案 7 :(得分:2)
通过将AutoIncrement添加到表的主键来解决ExecuteNonQuery()时出现错误。在您的情况下,如果您不想添加主键,那么我们必须为主键分配值。
ALTER TABLE `t1`
CHANGE COLUMN `id` `id` INT(11) NOT NULL AUTO_INCREMENT ;
答案 8 :(得分:1)
对我来说,当我改变
时问题得到解决Missing Constraint: Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Host plug-in JavaSE_0.0.0 has not been found.
到
<id name="personID" column="person_id">
<generator class="native"/>
</id>
在我的<id name="personID" column="person_id">
<generator class="increment"/>
</id>
。
之后,我再次遇到另一个字段(mobno)的相同错误。我尝试重新启动我的IDE,使用先前的后期问题重新创建数据库,当我使用(不使用Person.hbm.xml
并删除字段名称中的下划线重新创建表格时,最终修复了该数据库)
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;
,即使它是我以前的列名,甚至在我的名字中也不存在目前的表。即使在备份数据库(使用修改的列名,使用InnoDB引擎)之后,我仍然使用旧字段名称得到了相同的错误。这可能是由于该引擎中的缓存。
答案 9 :(得分:1)
要检测运行:
select @@sql_mode
-- It will give something like:
-- STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
要修复,请运行:
set global sql_mode = ''
答案 10 :(得分:1)
这是由于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
答案 11 :(得分:0)
对我来说真是太神奇了,因为它解决了字段'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;
.....
}
在这里您可以看到两个表都具有相同的名称。这是一个非常有趣的错误,是我做的:))))。更正此问题后,我的问题解决了。
答案 12 :(得分:0)
我在mariadb的AWS上遇到了一个问题-这就是我解决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
答案 13 :(得分:0)
为您的ID添加默认值,可以在表定义中说这将解决您的问题。
答案 14 :(得分:0)
我在2019年提出了这个问题。我的问题是用table2更新table1,而忽略了两个表中具有不同名称的变量。我遇到了与问题相同的错误:错误代码:1364。字段'id'在mysql中没有默认值。解决方法如下:
表1架构:id(唯一且自动递增)|名称|个人资料|年龄 表2架构:父亲|名称|个人资料
这解决了我的错误: INSERT IGNORE INTO table2(名称,配置文件)选择名称,配置文件FROM table1
答案 15 :(得分:0)
作为开发人员,强烈建议使用STRICT
模式,因为它可以让您查看可能出现的问题/错误/警告,而不是通过关闭严格模式来解决它。这也是更好的做法。
严格模式是查看凌乱,草率代码的绝佳工具。
答案 16 :(得分:0)
禁用 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;`