我的表结构是
CREATE TABLE IF NOT EXISTS `emp` (
`id` int(3) NOT NULL AUTO_INCREMENT,
`name` varchar(11) DEFAULT NULL,
`age` varchar(31) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
我的查询是:
INSERT INTO `emp` (`id`, `name`) VALUES ('1', 'prashant');
这适用于5.7以下的所有MYSQL版本,但不适用于MYSQL版本 5.7.12-0ubuntu1
获取错误:
#1364 - Field 'age' doesn't have a default value
此版本有什么新功能?
在5.7以下的mysql版本上试一试,你会看到差异。
谢谢:-)
答案 0 :(得分:3)
如果这在任何版本的mysql中都有效,那将是一个巨大的惊喜。将其粘贴到sqlfiddle.com(mysql 5.6或5.5)并自行确认。
age
定义为varchar(31)
,而不是null。因此,您的insert语句应该具有该列的值。或者你应该给它一个默认值。当您处于此状态时,请将其更改为更合适的数据类型。
CREATE TABLE IF NOT EXISTS `emp` (
`id` int(3) NOT NULL AUTO_INCREMENT,
`name` varchar(11) DEFAULT NULL,
`age` int(3) NOT NULL default 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
<强>更新强>
考虑到这一点,我认为你已经关闭了旧版mysql中的Strict Mode
严格模式控制MySQL处理无效或缺失值的方式 数据更改语句,如INSERT或UPDATE。值可以是 因几个原因无效。例如,它可能包含错误的数据 列的类型,或者可能超出范围。缺少值 当要插入的新行不包含非NULL值时 在其定义中没有显式DEFAULT子句的列。 (为一个 NULL列,如果缺少值,则插入NULL。)严格模式 也会影响DDL语句,例如CREATE TABLE。
所以我原来的陈述是错的!关闭字符串模式后,varchar的默认值可能是&#39;&#39; (不确定从未使用严格模式)
答案 1 :(得分:1)
在您的表格中描述为not null
。
`age` varchar(31) NOT NULL
因此,插入是必填字段。
答案 2 :(得分:0)
NOT NULL
约束强制字段始终包含值。这意味着您无法在不向此字段添加值的情况下插入新记录或更新记录。您还必须在insert
查询中为年龄赋值,因为它不能是null
。例如: -
insert into emp(`id`,`name`,`age`) values('1','rahul','26')
希望这有助于!!。评论进一步查询