字段'id'没有默认值?

时间:2014-09-16 09:24:32

标签: mysql insert create-table

我是这个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'
);

17 个答案:

答案 0 :(得分:32)

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

解决方案1 ​​

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

解决方案2

如果Solution-1不起作用,请尝试按以下步骤给出的Solution-2:

  1. 以管理员身份运行 MySQL管理员工具
  2. 然后转到启动变量。
  3. 然后转到“高级”选项卡。
  4. 找到SQL模式并删除STRICT_ALL_TABLES和/或STRICT_TRANS_TABLES,然后点击“应用更改”。
  5. 重启MySQL服务器。
  6. 完成。
  7. 注意:我在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)

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

答案 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;`