您的位置:首页 > 数据库 > MySQL

mysql约束中遇到的一些奇葩版本问题

2016-04-16 10:23 796 查看
最近在学习mysql的过程中遇到了几个很奇葩的问题,在这里跟大家分享下。

刚开始的时候以为这是mysql的bug问题,然后在不同的版本中测试,结果都跟我现在测试出现的结果不一样。

后来发现是我忽略了一个问题,以下会具体的说明:

在这里我先说明下我的mysql版本

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.6.21    |
+-----------+


遇到的问题一:

在约束非空的时候(列级约束)  not null

drop table if exists t_tmp;
create table t_user(
id int(10),
name varchar(30) not null,
email varchar(128)
);
 
insert into t_user(id,name,email) values(10,'xiaohan','123@163.com');
insert into t_user(id,name,email) values(20,'test','456@163.com');
 
insert into t_user(id,email) values(20,'xiaohan@163.com');


理论上这里会报错的,因为name字段添加了约束条件,我在工作环境中测试跟理论完全一样,会提示报错。

但是在我学习的环境中没有报错

mysql> create table t_tmp(
-> id int(10),
-> name varchar(30) not null,
-> email varchar(128)
-> );
Query OK, 0 rows affected (0.02 sec)
 
mysql> desc t_tmp;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(10)      | YES  |     | NULL    |       |
| name  | varchar(30)  | NO   |     | NULL    |       |
| email | varchar(128) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
 
mysql> insert into t_tmp(id,name,email) values(10,'xiaohan','123@163.com');
Query OK, 1 row affected (0.00 sec)
 
mysql> insert into t_tmp(id,name,email) values(20,'test','456@163.com');
Query OK, 1 row affected (0.02 sec)
 
mysql> insert into t_tmp(id,email) values(20,'xiaohan@163.com');
Query OK, 1 row affected, 1 warning (0.01 sec)


只是出现了一个warning,我一开始也没注意到这个warning,就开始查资料,为什么这里跟理论完全不一样,忙活了半天也没结果,后来仔细一看这是一个warning。

我们来看一下这个warning

mysql> show warnings;
+---------+------+-------------------------------------------+
| Level   | Code | Message                                   |
+---------+------+-------------------------------------------+
| Warning | 1364 | Field 'name' doesn't have a default value |
+---------+------+-------------------------------------------+


在我学习的mysql版本中,mysql会把这个当做一个warning来处理,但是在其他某些版本中会直接报错,执行失败。

遇到的问题二:

not null 和unique联合使用 时遇到的问题跟上面的第一个问题差不多,都是不会报错而是警告的问题

这里我直接贴我运行的结果

mysql> drop table if exists t_user;
Query OK, 0 rows affected (0.02 sec)
 
mysql>
mysql> create table t_user(
-> id int(10),
-> name varchar(30)  not null unique
-> );
Query OK, 0 rows affected (0.01 sec)
 
mysql> insert into t_user(id,name) values(1,'xiaohan');
Query OK, 1 row affected (0.00 sec)
 
mysql> insert into t_user(id) values(1);
Query OK, 1 row affected, 1 warning (0.00 sec)
 
mysql> show warnings;
+---------+------+-------------------------------------------+
| Level   | Code | Message                                   |
+---------+------+-------------------------------------------+
| Warning | 1364 | Field 'name' doesn't have a default value |
+---------+------+-------------------------------------------+
1 row in set (0.00 sec)


因此,一开始我以为这是一个bug,现在看来完全不是应该跟版本有关吧。因此在实际的开发过程中,首先的测试下自己的环境。以免出现各种奇葩坑爹的问题。

                             
      

xiaohan---2016.4.16
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: