表的约束
目录
表的完整性约束
约束条件与数据类型的宽度一样,都是可选参数,主要分为以下几种:
unsigned 无符号与int等搭配
not null :非空约束,指定某列不能为空;
unique : 唯一约束,指定某列或者几列组合不能重复
primary key :主键,指定该列的值可以唯一地标识该列记录 第一个 非空加唯一
foreign key :外键,指定该行记录从属于主表中的一条记录,主要用于参照完整性
auto_increment:自增必须设置最少(unique)自带非空只能对数字有效
设置了自增必须以一一对应的格式添加数据
如果删除了某个数据 其他不变 自带记录
delete from t1;如果有自增id,新增的数据,仍然是以删除前的最后 id 作为起始。
truncate table tl;数据量大,删除速度比上一条快,且直接从零开始,
unsigned 无符号
与int 搭配
实列
drop database day01;
create database day01;
use day01;
create table d1(
id int unsigned);
insert into d1 values(1);
not null 非空约束
不可为空
实列
drop database day01;
create database day01;
use day01;
create table d1(
id int not null,
name char(12),
hobby set('抽烟','喝酒','烫头','搓脚')
);
insert into d1(id,name,hobby) values(
1,'小强','抽烟,喝酒');
unique 唯一约束
注意
null 在mysql中 不一样
在 mysql中每次添加的null 不一样 对于mysql 数据与数据间相等就是重复 所以 就算设置了 unique 唯一 也是可以重复的
实列
create table t3(
id int unique,
username char(18) unique,
);
unique 联合唯一
联合唯一 ip 加端口 不可以唯一
联合唯一 不是ip不可以重复 也不是port不可以重复 而是 ip+port不可以重复
实列
create table t2(
id inta primary key,
servername char(12) not null,
ip char(15),
port int,
unique(ip, port)
);
default默认值
create table t3(int unsigned not null default 18);
primary key 主键
primary key 主键
一张表只能有一个
如果不指定主键,默认是第一个非空+唯二
联合主键primary, key(字段1,字段2)
primary key 主键 设置
非空+唯一 第一个设置会被设置成主键
如果一张表中没有设置primary key 主键,那么第一个设置非空+唯一的字段会被设置成主键
一张表中只能有一个主键
实列
create table t4(
id int not null unique,
username char(18) not null unique, age tinyint unsigned
);
联合主键
姓名中 姓 和 名唯一
create table t14(
id int,
server_name char(12),
ip char(15),
port char(5),
primary key(ip,port));
foreign 外键约束
创建时 先创被关联的 在创关联的 没有给权限 不可以更新删除(好处避免错误)
# 外键约束 : 对应外表中的字段至少是unique的,推荐使用主键作为关联字段 一变全变
基本格式
foreign key(自己的字段) references 其他表(字段)
给权限
on delete cascade 级联删除一般不设置
on update cascade 级联更新
# create table class3(
# id int primary ,
# cname char(12) not null unique,
# start_date date,
# period char(12),
# course char(12),
# teacher char(12)
# );
# create table student3(
# id int primary key auto_increment,
# name char(12) not null,
# gender enum('male','female'),
# cid int,
# foreign key(cid) references class3(id) on delete cascade on update cascade
# );
自增auto_increment
自增auto_increment
必须设置最少 unique
auto increment自带非空
只能对 数字 有效
删除了某个数据 其他不变 自带记录**
delete from t1;如果有自增id,新增的数据,仍然是以删除前的最后 id 作为起始。
truncate table tl;数据量大,删除速度比上一条快,且直接从零开始,
不需要自己写、
只能对数字有效自带非空约束
并至少是unique的约束之后才能使用auto increment
实列
create table t20(id int primary key auto increment,
name char (12));
设立了自增后 只可以这么写 看起来麻烦 其实不麻烦 以为数据多了 你不知道那一条
insert into t20(name, job, age, post) values
(' alex',' cto', 84, 'Iuffy ),
非学,无以致疑;非问,无以广识