ERROR 1364(HY000):字段'MY_DATE'没有默认值

时间:2011-02-15 06:30:21

标签: sql mysql mysql-error-1364

create table MYTABLE
{
    MY_DATE int NOT NULL AUTO_INCREMENT,
    NAME varchar(255) NOT NULL UNIQUE
};
INSERT INTO MYTABLE(NAME)values(jessica);

为什么我会收到此错误?

  

错误1364(HY000):字段'MY_DATE'没有默认值

4 个答案:

答案 0 :(得分:3)

来自docs

  

每个表只能有一个AUTO_INCREMENT列,必须编制索引,并且不能有DEFAULT值。

我想你会发现,因为你没有索引MY_DATE,它可能会默默地忽略AUTO_INCREMENT选项(我无法保证,这只是假设,但是注意在文档中仍然相关)。

我在AUTO_INCREMENT内容上看到的所有样本都有(相当于):

PRIMARY KEY (MY_DATE)

或者,可能以严格的SQL模式运行。我看到的所有文档似乎都表明,在没有特定默认值的情况下,插入中的未列出列如果可以为空则将获得NULL,或者如果不可为空则为默认类型:

  

如果未在严格SQL模式下运行,则任何未显式赋值的列都将设置为其默认值(显式或隐式)。例如,如果指定的列列表未指定表中的所有列,则将未命名的列设置为其默认值。第10.1.4节“数据类型默认值”中描述了默认值赋值。

对于整数类型,默认值为0(无论如何都应该启动自动增量)。

但是,在严格的SQL模式下(来自here):

  

事务表发生错误,并且语句被回滚。

答案 1 :(得分:2)

您使用的是哪个版本的MySQL?

我正在使用5.1.41社区,而create table SQL则提供

  

SQL错误(1075):表定义不正确;只能有一个自动列,必须将其定义为键

接下来将其更正为下面的

create table MYTABLE
 (
 MY_DATE int NOT NULL AUTO_INCREMENT primary key,
 NAME varchar(255) NOT NULL UNIQUE
 );

插入声明

INSERT INTO MYTABLE(NAME)values(jessica);

结果

  

SQL错误(1054):“字段列表”中的未知列“jessica”

因为它没有被引用。一旦更正到以下内容:

INSERT INTO MYTABLE(NAME)values('jessica');

有效。您不必为auto_increment主键提供任何值,但可以

现在,我们来谈谈MySQL的怪癖。您可以选择包含该列,并将值设置为NULL。您也可以给它一个SPECIFIC值,MySQL会很乐意使用它,即使它被定义为auto_increment。

INSERT INTO MYTABLE(my_date,NAME)values(41,'jessica2');
INSERT INTO MYTABLE(my_date,NAME)values(null,'jessica3');
INSERT INTO MYTABLE(NAME)values('jessica4');
DELETE FROM MYTABLE where my_date=43;
INSERT INTO MYTABLE(my_date,NAME)values(3,'jessica5');
INSERT INTO MYTABLE(NAME)values('jessica?');
select * from mytable;

当你专门设置数字为41时,下一个数字变为42,然后是43.它允许我们专门使用3,即使这样,虽然在我们使用特定数字3之前删除了43,但下一个数值仍然是44。

输出

MY_DATE  NAME
41       jessica2
42       jessica3
3        jessica5
44       jessica?

答案 2 :(得分:0)

您没有在INSERT语句中为MY_DATE提供值,并且没有定义默认值。 (正如paxdiablo指出的那样,在这种情况下不能定义默认值。)不直观地,你需要给MY_DATE一个值,如果该值为零或null,那么MySQL将分配下一个自动增量值。像这样:

insert into mytable values(null,'jessica');

答案 3 :(得分:0)

编辑此文件/etc/mysql/mysql.conf.d/mysqld.cnf

在[mysqld]下添加以下语句

sql_mode =

这对我来说很好。