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'没有默认值
答案 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 =
这对我来说很好。