约束 级联
约束
除了数据类型以外额外添加的约束和数据类型一样是可选参数,添加约束是为了保证数据的一致性,完整性,而且为主键) DEFAULT 为该字段设置默认值 UNSIGNED 无符号 ZEROFILL 使用0填充
PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY (FK) 标识该字段为该表的外键 NOT NULL 标识该字段不能为空 UNIQUE KEY (UK) 标识该字段的值是唯一的 AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键) DEFAULT 为该字段设置默认值 UNSIGNED 无符号 ZEROFILL 使用0填充
not null 不可空 不添加约束条件not null 的话字段默认是null,插入数据时如果未设置则自动添加默认值
mysql> create table t(id int); #字段默认可以插入空 Query OK, 0 rows affected (0.24 sec) mysql> desc t; #查看表显示默认为null +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 1 row in set (0.01 sec) mysql> insert into t values(); #插入一个空的值 Query OK, 1 row affected (0.06 sec) mysql> select * from t; #查询到表内有一个 null 的记录 +------+ | id | +------+ | NULL | +------+ 1 row in set (0.00 sec)
创建一个t2表设置为不能为空 插入一个空的数据 就会报错
default 默认值约束 可以指定字段的默认值
设置id字段有默认值后,则无论id字段是null还是not null,都可以插入空,插入空默认填入default指定的默认值
create table user (id ind,name char(10) not null,sex char(1) default "man");
unique 唯一性约束 该字段的值不能重复
unique其实是一种索引,索引是一种数据结构,用于提高查询效率
单列唯一约束
create table t1(id char(10) unique);
多列联合唯一约束
create table t2(id char(10),number char(12),unique(id,number));
多列情况下 两个都相同的就重复 单个不相同就不会
设置唯一约束 UNIQUE 方法一: create table department1( id int, name varchar(20) unique, comment varchar(100) ); 方法二: create table department2( id int, name varchar(20), comment varchar(100), constraint uk_name unique(name) ); mysql> insert into department1 values(1,'IT','技术'); Query OK, 1 row affected (0.00 sec) mysql> insert into department1 values(1,'IT','技术'); ERROR 1062 (23000): Duplicate entry 'IT' for key 'name'
primary key主键约束 标识该字段为该表的主键,可以唯一的标识记录,从约束的角度来看主键约束和非空加唯一约束没有区别
create table student(id int primary key);
主键也可以多列联合 和上面的unique用法一样
一张表中必须有且只有一个主键。主键的字段名基本上都叫id,主键的类型需要设置成整型,别的也可以但是最好不好设置其他的
单列主键 #方法一:not null+unique create table department1( id int not null unique, #主键 name varchar(20) not null unique, comment varchar(100) ); #方法二:在某一个字段后用primary key create table department2( id int primary key, #主键 name varchar(20), comment varchar(100) ); #方法三:在所有字段后单独定义primary key create table department3( id int, name varchar(20), comment varchar(100), constraint pk_name primary key(id); #创建主键并为其命名pk_name
多列做主键 create table service( ip varchar(15), port char(5), service_name varchar(10) not null, primary key(ip,port) );
auto_increment
通常搭配主键字段使用 可以自动为你的数据分配逐渐增加
create table t9(id int primary key auto_increment,name char(3));
不指定id,则自动增长 create table student( id int primary key auto_increment, name varchar(20), sex enum('male','female') default 'male' ); 也可以指定id mysql> insert into student values(4,'a','female'); mysql> insert into student values(7,'w','female'); 修改自动增长的起始位置 alter table t9 auto_increment = 7; 也可以创建表时指定auto_increment的初始值,注意初始值的设置为表选项,应该放到括号外 create table student( id int primary key auto_increment, name varchar(20), sex enum('male','female') default 'male' )auto_increment=3; 对于自增的字段,在用delete删除后,再插入值,该字段仍按照删除前的位置继续增长,应该用truncate清空表,
比起delete一条一条地删除记录,truncate是直接清空表,在删除大表时用它 自动增长 只能用于整型
foreign key 专门用于为表和表之间建立物理关联
两个表之间的关系有:多对一,多对多,一对一
多对一 create table dept(id int primary key auto_increment,name char(10),manager char(10)); create table emp(id int primary key auto_increment,name char(10),dept_id int, foreign key(dept_id) references dept(id)); 多对多 :用户表+用户与主机关系表+主机表 先创建了一个教师表 create table teacher (id int primary key auto_increment,name char(10)); 再创建一个学生表 create table student (id int primary key auto_increment,name char(10)); create table t_s (t_id int, s_id int, foreign key(t_id) references teacher(id), foreign key(s_id) references student(id) ); 再创建一个存放教师和学生关系的关系表 create table t_s (t_id int, s_id int, foreign key(t_id) references teacher(id), foreign key(s_id) references student(id), primary key(t_id,s_id) );
添加外键约束时: 被关联的表需要先被创建
主表应该先插入 从表后插入
在删除数据前(主表)前 要保证该从表数据都删除了
在更新数据前 要先保证从表没有数据关联到主表
级联:
指的是就是同步更新和删除
语法:在创建外键时 在后面添加 on update cascade 同步更新
on delete cascade 同步删除
实例: create table class(id int primary key auto_increment,name char(10)); create table student( id int primary key auto_increment, name char(10), c_id int, foreign key(c_id) references class(id) on update cascade on delete cascade );