欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

mysql默认值和是否为空的注意事项

mysql里面没设置默认值字段也不允许为空,插入语句中也没指定值却能插入成功!是什么情况??

mysql里面没设置默认值字段也不允许为空,插入语句中也没指定值却能插入成功!是什么情况??
 
a735041553 | 浏览 1779 次
发布于2015-01-26 22:25最佳答案
对应的字段属性是否有值或者是不是空字符串,试试null 能否插入成功呢?
追问
我有两个字段 name, age 。age字段是 not null的, 
insert into test (name) values ('lsq')
可以成功~ 
insert into test (name,age) values ('lsq',null)
是报错的
追答
那这个就对了啊,不能插入null,你上面那个是没有插入值
我们有学习小组也   希望一起学习进步 Oracle-Linux交流 103 382  476



mysql数据库中的默认“无”和“null”,有什么区别呢?


默认null   有默认值,值为null 
默认 无    没有设置默认值


如果有默认值,则不允许为空,否则前后矛盾,数据修改之后依然是它的默认值
同时我想知道的就是如果我设置了默认 然后没有设置可空 查询时候会自动填入默认么 如果设置可空会有什么后果呢
当然 我指的严格模式下
请务必来人救我

经常用mysql的人可能会遇到下面几种情况:

1、我字段类型是not null,为什么我可以插入空值

2、为什么not null的效率比null高

3、判断字段不为空的时候,到底要用

select * from table where column <> ”

还是要用

select * from table where column is not null 呢。

带着上面几个疑问,我们来简单的研究一下null 和 not null 到底有什么不一样,他们之间的区别是什么以及各自的效率问题。

首先,我们要搞清楚“空值” 和 “NULL” 的概念:

1、空值是不占用空间的

2、mysql中的NULL其实是占用空间的,下面是来自于MYSQL官方的解释

“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”

打个比方来说,你有一个杯子,空值代表杯子是真空的,NULL代表杯子中装满了空气,虽然杯子看起来都是空的,但是区别是很大的。

搞清楚“空值”和“NULL”的概念之后,问题基本就明了了,我们做个例子测试一下:

CREATE TABLE `codetc` ( 
`col1` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , 
`col2` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL 
) ENGINE = MYISAM ;

插入数据:

INSERT INTO `codetc` VALUES (null,1);

mysql发生错误:

#1048 – Column ‘col1′ cannot be null

再来一条

INSERT INTO `codetc` VALUES ('',1);

成功插入。

可见,NOT NULL 的字段是不能插入“NULL”的,只能插入“空值”,上面的问题1也就有答案了。

对于问题2,上面我们已经说过了,NULL 其实并不是空值,而是要占用空间,所以mysql在进行比较的时候,NULL 会参与字段比较,所以对效率有一部分影响。

而且B树索引时不会存储NULL值的,所以如果索引的字段可以为NULL,索引的效率会下降很多。

我们再向codetc的表中插入几条数据:

INSERT INTO `codetc` VALUES ('',NULL);
INSERT INTO `codetc` VALUES ('1','2');

现在根据需求,我要统计codetc表中col1不为空的所有数据,我是该用“<> ”” 还是 “IS NOT NULL” 呢,让我们来看一下结果的区别。

SELECT * FROM `codetc` WHERE coll IS NOT NULL;
SELECT * FROM `codetc` WHERE col1 <> '';

可以看到,结果迥然不同,所以在实际情况中,我们一定要根据业务需求,搞清楚是否需要使用null或者not null。

注意:MySQL字段尽量避免NULL,应该指定列为NOT NULL,除非你想存储NULL。在MySQL中,含有空值的列很难进行查询优化,而且对表索引时不会存储NULL值的,所以如果索引的字段可以为NULL,索引的效率会下降很多。因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。

本文永久地址:http://blog.it985.com/12398.html

本文出自IT985博客 ,转载时请注明出处及相应链接。

本文数据库(mysql)相关术语:navicat for mysql mysql workbench mysql数据库 mysql 存储过程 mysql安装图解 mysql教程 mysql 管理工具
 来自 http://www.codesec.net/view/166130.html

普通分类: