约束条件
mysql> create table t2(id int not null,name varchar(11) not null); -- 创建表t2,设置id和name的约束条件
Query OK, 0 rows affected (0.01 sec)
mysql> insert t2 values(1,'egon'); -- 可正常插入数据
Query OK, 1 row affected (0.00 sec)
mysql> create table t3(id int,name varchar(11)); -- 我们再次建个无约束条件的t3
Query OK, 0 rows affected (0.01 sec)
mysql> insert t2 values(); -- 向t2插入空白报错
ERROR 1364 (HY000): Field 'id' doesn't have a default value
mysql> insert t3 values(); -- 向t3插入空白可以正常插入,这里需要mysql是严格模式
Query OK, 1 row affected (0.00 sec)
- not null default 111>>不能为空,且默认值为111
mysql> create table t1(id int not null default 123); -- 创建表t1,设置约束条件不能为空,且默认值为123
Query OK, 0 rows affected (0.01 sec)
mysql> insert t1 values(); -- 这时我们插入空的时候,是可以正常插入的,因为有默认值了
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1; -- 我们查看发现id是123,说明当我们新增的值为空的时候,会自动传入设置的默认值
+-----+
| id |
+-----+
| 123 |
+-----+
1 row in set (0.00 sec)
mysql> create table t4(id int unique); -- 新建表t4,设置约束条件为unique,不能重复
Query OK, 0 rows affected (0.01 sec)
mysql> insert t4 value(111); -- 我们插入一个id为111
Query OK, 1 row affected (0.00 sec)
mysql> insert t4 value(111); -- 再次插入111的id,它提示我们111已经有了
ERROR 1062 (23000): Duplicate entry '111' for key 'id'
mysql> insert t4 value(11); -- 当我们插入11的时候可以正常插入,说明表t4,不能插入重复的值
Query OK, 1 row affected (0.00 sec)
mysql> create table t5(id int,ip varchar(15),port int,unique(ip,port)); -- 创建新表t5,设置约束为值
唯一,但是是ip+port一起算唯一即可
Query OK, 0 rows affected (0.02 sec)
mysql> insert t5 values(1,12,123); -- 插入id都是1,ip和port有区别
Query OK, 1 row affected (0.00 sec)
mysql> insert t5 values(1,12,123); -- 插入id都是1,ip和port重复,报错
ERROR 1062 (23000): Duplicate entry '12-123' for key 'ip'
mysql> insert t5 values(1,12,124); -- 插入ip重复,port不同,正常
Query OK, 1 row affected (0.00 sec)
mysql> insert t5 values(1,13,123); -- 插入ip不同,port重复,也正常
Query OK, 1 row affected (0.00 sec)
mysql> select * from t5;
+------+------+------+
| id | ip | port |
+------+------+------+
| 1 | 12 | 123 |
| 1 | 12 | 124 |
| 1 | 13 | 123 |
+------+------+------+
3 rows in set (0.00 sec)
- not null 和unique的化学反应>>被识别成主键
- primary key>>主键
- 主键没有着明确的概念定义,其实是索引的一种,并且是唯一性索引的一种,且必须定义为“PRIMARY KEY”,主键不能重复,一个表只能有一个主键
- Mysql中规定自增列必须为主键,在插入时,如果自动增长列没有输入值,则插入的值为自动增长后的值;如果输入的值为0或者null,则插入的值也为自动增长后的值;如果插入某个确定的值,且该值在前面没有出现过,则可以直接插入
- 主键一定是唯一性索引,唯一性索引并不一定就是主键
- 一个表中可以有多个唯一性索引,但只能有一个主键
- 主键列不允许空值,而唯一性索引列允许空值
- 索引可以提高查询的速度
- 主键的约束效果是not null + unique
- innodb表有且只有一个主键,但是该主键可以是联合主键
后续建表必写:id int primary key auto_increment
mysql> create table t6(id int primary key auto_increment,name varchar(11));
Query OK, 0 rows affected (0.01 sec)