mysql约束中遇到的一些奇葩版本问题
2016-04-16 10:23
796 查看
最近在学习mysql的过程中遇到了几个很奇葩的问题,在这里跟大家分享下。
刚开始的时候以为这是mysql的bug问题,然后在不同的版本中测试,结果都跟我现在测试出现的结果不一样。
后来发现是我忽略了一个问题,以下会具体的说明:
在这里我先说明下我的mysql版本
遇到的问题一:
在约束非空的时候(列级约束) not null
理论上这里会报错的,因为name字段添加了约束条件,我在工作环境中测试跟理论完全一样,会提示报错。
但是在我学习的环境中没有报错
只是出现了一个warning,我一开始也没注意到这个warning,就开始查资料,为什么这里跟理论完全不一样,忙活了半天也没结果,后来仔细一看这是一个warning。
我们来看一下这个warning
在我学习的mysql版本中,mysql会把这个当做一个warning来处理,但是在其他某些版本中会直接报错,执行失败。
遇到的问题二:
not null 和unique联合使用 时遇到的问题跟上面的第一个问题差不多,都是不会报错而是警告的问题
这里我直接贴我运行的结果
因此,一开始我以为这是一个bug,现在看来完全不是应该跟版本有关吧。因此在实际的开发过程中,首先的测试下自己的环境。以免出现各种奇葩坑爹的问题。
xiaohan---2016.4.16
刚开始的时候以为这是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
相关文章推荐
- LeetCode 182 -Duplicate Emails ( MYSQL )
- mysql总结
- 安装绿色版mysql-5.7.11-win32
- LeetCode 181 -Employees Earning More Than Their Managers ( MYSQL )
- MySQL Workbench
- mysql 远程连接配置
- mysql 远程连接配置
- mysql学习(列属性)
- Windows上 MySQL 5.7+安装步骤
- R导入mysql数据
- 【10】mysql编程
- 翻译:如何在Node.js和Express中使用MySql
- 【9】mysql数据事务语言DTL(Data Transaction Language)
- 安装版MySQL安装图解
- mysql模糊查询like/REGEXP
- mysql 5.5.x zip直接解压版安装方法
- mysql Non-Transactional Database Only(只支持MyISAM)
- MySQL查询空字段或非空字段(is null和not null)
- MySQL查看与修改当前数据库编码的方法
- MySQL中使用SQL语句对字段进行重命名