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' 没有默认值
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' 没有默认值
从文档:
每个表只能有一个 AUTO_INCREMENT 列,它必须被索引,并且不能有 DEFAULT 值。
我想你会发现,因为你没有索引MY_DATE
,它可能会默默地忽略这个AUTO_INCREMENT
选项(我不能保证,这只是假设,但文档中的注释仍然是相关的)。
我可以在这些AUTO_INCREMENT
东西上看到的所有样本都有(相当于):
PRIMARY KEY (MY_DATE)
或者,您可能在严格的 SQL 模式下运行。我见过的所有文档似乎都表明,在没有特定默认值的情况下,插入中的未列出列如果可以为空,则为 NULL,如果不可为空,则为默认类型:
如果您未在严格的 SQL 模式下运行,则任何未显式给定值的列都将设置为其默认值(显式或隐式)。例如,如果您指定的列列表未命名表中的所有列,则未命名的列将设置为其默认值。默认值分配在第 10.1.4 节,“数据类型默认值”中描述。
对于整数类型,默认值为 0(无论如何都应该启动自动增量)。
但是,在严格的 SQL 模式下(从这里):
事务表发生错误,并且该语句被回滚。
您使用的是哪个版本的 MySQL?
我正在使用 5.1.41 社区和创建表 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):“字段列表”中的未知列“杰西卡”
因为它没有被引用。一旦将其更正为以下内容:
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?
您没有在 INSERT 语句中为 MY_DATE 提供值,并且没有定义默认值。(正如 paxdiablo 指出的那样,在这种情况下不能定义默认值。)不直观的是,您确实需要为 MY_DATE 提供一个值,如果该值为零或 null,那么 MySQL 将分配下一个自动增量值。像这样:
insert into mytable values(null,'jessica');
编辑这个文件 /etc/mysql/mysql.conf.d/mysqld.cnf
在 [mysqld] 下添加以下语句
sql_mode =
这对我来说非常有效。