字段约束条件
无符号、零填充
unsigned # 无符号
id int unsigned
zerofill # 零填充
id int(3) zerofill # 存入数字不足三位时以0填充至三位
非空
create table t1(id int,name varchar(16));
insert into t1(id) values(1); # 只存入某一个字段的数据可以直接指定
insert into t1(name) values('jason');
insert into t1(name id) values('kevin',2); # 存入表内数据顺序可以自己指定
结果:
+------+-------+
| id | name |
+------+-------+
| 1 | NULL |
| NULL | jason |
| 2 | kevin |
+------+-------+
添加约束条件非空
create table t2(id int,name varchar(16) not null);
insert into t2(id) values(1); # 报错 ERROR 1364 (HY000): Field 'name' doesn't have a default value
insert into t2(name) values('jason');
insert into t2 values(2,''); #
insert into t2 values(3,null); # ERROR 1048 (23000): Column 'name' cannot be null
结果:
+------+-------+
| id | name |
+------+-------+
| NULL | jason |
| 2 | |
+------+-------+
# 所有字段类型在不加约束条件的情况下默认都可以为空,即null
# 非空约束条件下不输值和输null都是一样报错,如果输的值为空格或者说只要输入的值不是null就可以
默认值 default
create table t3(id int default 888,
name varchar(16) default '匿名');
insert into t3 values();
insert into t3 values(2,'jason');
结果:
+------+--------+
| id | name |
+------+--------+
| 888 | 匿名 |
| 2 | jason |
+------+--------+
# 在不输入信息的情况下,执行了insert语句,以默认值替代
唯一值 unique
单列唯一:表示在某个字段下数据值不重复、
create table t4(id int unique,name varchar(16) unique);
insert into t4 values(1,'jason'),(2,'jason');
# ERROR 1062 (23000): Duplicate entry 'jason' for key 'name'
联合唯一:某个字段可能有重复,但是多个字段组合起来的结果不重复
create table t5(id int,ip varchar(32),
port int,unique(ip,port));
insert into t5 values(1,'127.0.0.1',8080),(2,'127.0.0.1',8081),
(3,'192.268.110.110',8080);
insert into t5 values(4,'127.0.0.1',8080);
# ERROR 1062 (23000): Duplicate entry '127.0.0.1-8080' for key 'ip'
+------+-----------------+------+
| id | ip | port |
+------+-----------------+------+
| 1 | 127.0.0.1 | 8080 |
| 2 | 127.0.0.1 | 8081 |
| 3 | 192.268.110.110 | 8080 |
+------+-----------------+------+
主键 primary key
1.但从约束层面上看主键相当于not null + unique 非空且唯一
create table t6(id int primary key,name varchar(16));
insert into t6(name) values('jason'); # ERROR 1364 (HY000): Field 'id' doesn't have a default value
insert into t6 values(1,'jason');
insert into t6 values(2,'kevin');
表结构:
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(16) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
在这个表结构中我们可以看到id已经被设为主键了
2.InnoDB存储引擎规定了所有的表都必须有且只有一个主键(主键是组织数据的重要条件并且主键可以加快数据的查询速度)
1.当表中没有主键也没有其他非空切唯一的字段的情况下
InnoDB会采用一个隐藏的字段作为表的主键 隐藏意味着无法使用 基于该表的数据查询只能一行行查找 速度很慢
2.当表中没有主键但是有其他非空且唯一的字段 那么会从上往下将第一个该字段自动升级为主键
create table t7(id int not null unique,name varchar(16) not null unique);
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(16) | NO | UNI | NULL | |
+-------+-------------+------+-----+---------+-------+
我们可以看到id被设置为主键
自增
create table t8(id int primary key auto_increment,name varchar(16));
insert into t8(name) values('jason'),('kevin'),('oscar'),('jerry');
+----+-------+
| id | name |
+----+-------+
| 1 | jason |
| 2 | kevin |
| 3 | oscar |
| 4 | jerry |
+----+-------+
该约束条件不能单独出现 并且一张表中只能出现一次 主要就是配合主键一起使用
'''
自增特性
自增不会因为数据的删除而回退 永远往下自增
如果中间自己设置了一个更大的数,那么后续基于这个数字继续往下自增
如果想重置某张表的主键值 可以使用
truncate t9; 清空表数据并重置主键
'''
外键
外键的作用
用于标识数据与数据之间的关系(主要用于不同表之间数据的关联)
为什么需要外键(以员工信息表为例)
员工信息表内可能有 id name age male e_maile phone address department 等字段
如果我们将所有的数据全放在一张表中,首先会造成存取数据的冗余,其次会导致数据的扩展性极差
如果我们将拆分成不同的表格归类整理,会解决上述问题,但是会造成不同的表之间数据没了关系
什么是外键
外键即外键字段
为了将不同的表数据连接起来,我们使用外键字段,就是在某张表中再加一个字段用于标识另一张表中的数据
表关系的判断
表关系一共可以分为四种 一对一 一对多 多对多 没有关系
1.一对一
一张表中的一条数据只能对应另一张表中的一条数据,另一张表中的数据也只能对应这张表中的一条数据,就像商品表与商品库存表,一个商品只能有一个库存,一个商品库存也只能有一个商品
2.一对多
这里我们以商品表和供货商表举例
一个商品只能有一个供货商,一个供货商可以提供多个商品
这种一方只能对应一个,另一方能对应多个的关系就是一对多的关系
3.多对多
以书籍和作者为例
一本书可以署名多个作者,一名作者也可以写多本书
这种双方都是多对多的关系就称之为多对多
外键字段的建立
1.一对一
外键字段建立在任何一方都可以,但是建议建立在使用频率较高的一方
create table goods(id int primary key auto_increment,name varchar(32),
detail_id int unique,
# 级联更新级联删除,另一张表修改以后主键所在的表自动跟着修改
foreign key(detail_id) references repertory(id)
on update cascade
on delete cascade);
create table repertory(id int primary key auto_increment,name varchar(32),num int);
2.一对多
create table commodity(id int primary key auto_increment,
name varchar(32),
dep_id int,
foreign key(dep_id) references supplier(id)
on update cascade
on delete cascade);
create table supplier(id int primary key auto_increment,
sup_name varchar(32));
3.多对多
多对多比较特殊,它不能直接在表中创建外键字段,需要有第三张表,用这张表来存储那两张表之间的关系
create table book(id int primary key auto_increment,
title varchar(32),price float(5,2));
create table author(id int primary key auto_increment,
name varchar(32));
# 创建第三张表用来存储两张表之间数据的关系
create table book_author(id int primary key auto_increment,
author_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade,
book_id int,
foreign key(book_id) references book(id)
on update cascade
on delete cascade);
标签:约束条件,insert,varchar,name,int,key,id
From: https://www.cnblogs.com/zyg111/p/16923053.html