[转帖]mysql那点事(行锁+not null + varchar)_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 1999 | 回复: 0   主题: [转帖]mysql那点事(行锁+not null + varchar)        下一篇 
liandong
注册用户
等级:新兵
经验:51
发帖:61
精华:0
注册:2011-11-14
状态:离线
发送短消息息给liandong 加好友    发送短消息息给liandong 发消息
发表于: IP:您无权察看 2014-12-25 10:07:34 | [全部帖] [楼主帖] 楼主

一。not null vs DEAFUL value

有人说芳华就是批驳的年光光阴,这种说法并不夸大。这种批驳的特点是很高的积极性和很强的原则性。? 在建表的时辰,凡是会请求给所有字段一个默认值,1来避免产生null字段,2来还可以在写代码的时辰偷下懒。

case1: not null +default


于是如许的create sql就出来了
Sql代码??

DROP?TABLE?IF?EXISTS?`zhushan`.`admin`;??
CREATE?TABLE??`zhushan`.`admin`?(??
??`admin_id`?int(10)?unsigned?NOT?NULL?auto_increment,??
??`name`?varchar(20)?NOT?NULL?default?""admin"",??
??`pwd`?varchar(20)?NOT?NULL?default?""amdin"",??
??PRIMARY?KEY??(`admin_id`)??
)?ENGINE=InnoDB?DEFAULT?CHARSET=utf8;??
?


好,我一向认为如许是:?name/pwd 字段不克不及为空,并且插入null的话,会默认填写admin

那么测试一下:
Sql代码??

?into?admin?(name,pwd)?values(null,2)??
?Column ""name"" cannot be null .?
?


实际上在Mysql指定列 not null 的时辰,其含义是插入sql中,该字段值不克不及为null!!后面的default 也就不会履行了。是以在写了default value之后,还是须要把not null 去掉的。

?

case2: default ,没有not null
Sql代码??

DROP?TABLE?IF?EXISTS?`zhushan`.`admin`;??
CREATE?TABLE??`zhushan`.`admin`?(??
??`admin_id`?int(10)?unsigned?NOT?NULL?auto_increment,??
??`name`?varchar(20)?default?""admin"",??
??`pwd`?varchar(20)?default?""amdin"",??
??PRIMARY?KEY??(`admin_id`)??
)?ENGINE=InnoDB?DEFAULT?CHARSET=utf8;??


?同样应用上方的sql进行插入:
Sql代码??

?into?admin?(name,pwd)?values(null,2)??


获得的成果居然更恶心:default字段失效了!插入null居然直接赋值成null了
Sql代码??

mysql>?SELECT?*?FROM?admin?a;??
+----------+-------+-------+??
|?admin_id?|?name??|?pwd???|??
+----------+-------+-------+??
|????????1????|?NULL?|?2???????|??
+----------+-------+-------+??


?case3: default /not null 其实都不克不及解决题目,最简单的办法就是全部not null + default, 对须要取默认值的字段,语句直接跳过该字段(类似case1,2中的admin_id),如许就会取到默认值了。

二。行锁

InnoDB?行锁是经由过程给索引上的索引项加锁来实现的,这一点?MySQL?与?ORACLE?不合,后者是经由过程在数据块中对响应数据行加锁来实现的。?InnoDB?这种行锁实现特点意味着:只有经由过程索引前提检索数据,?InnoDB?才应用行级锁,不然,?InnoDB?将应用表锁!这里讲的很清楚?http://blog.chinaunix.net/u2/69385/showart_1852286.html

因为作者没有写是mysql4,还是mysql5,于是本身在 Mysql5下测试了一把,发明还是如许。
Sql代码??

Session1:??
??
mysql>??set?autocommit=0;???//不主动提交??
??
Query?OK,?0?rows?affected?(0.00?sec)??
??
mysql>?SELECT?*?FROM?account_seller?t?where?issue_day?=?0?for?;??
??
4?rows?in?set?(0.00?sec)??
??
???
??
Session2:?//session2这里就守候了??
??
???????SELECT?*?FROM?account_seller?t?where?issue_day?=?300?for???
??
???????!Lock?wait?timeout?exceeded;?try?restarting?transaction??


三。varchar

CHAR?和VARCHAR?类型声明的长度默示你想要保存的最大字符数.

?

gbk定义的VARCHAR(5), 可以装下几许器材呢???

可以放下5个1 ""11111"",也可以放下‘我是个坏人’,然则绝对放不下""123456"".苏霍姆林斯基

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论