mysql 约束
约束的作用:保证数据的完整性和一致性
表的设计
1.not null(不可空) 与 default(默认值)
默认值:创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值
2 unique (不同的),在mysql中称为单列唯一
-单列唯一
-多列唯一
- 组合唯一(联合唯一):只要有一列不同,就可以插入数据
3 primary key(索引优化查询)
sql版本中,一张表中只允许有一个主题,通常都是id,cid,nid,sid.
一个表中可以:
单列做主键
多列做主键(复合主键):表的主键含有一个以上的字段组成
约束:等价于not null +unique,字段的值不为空且唯一
存储引擎默认是innodb;对应innodb存储引擎来说,一张表必须有一个主键。
4 auto_increment
约束:约束的字段为自动增长,约束的字段必须同时被key约束
不指定id,则自动增长
mysql> insert into student values(4,'asb','female'); Query OK, 1 row affected (0.00 sec) mysql> insert into student values(7,'wsb','female'); Query OK, 1 row affected (0.01 sec) mysql> select * from student; +----+--------+--------+ | id | name | sex | +----+--------+--------+ | 1 | 老白 | male | | 2 | 小白 | male | | 4 | asb | female | | 7 | wsb | female | +----+--------+--------+ rows in set (0.00 sec) # 再次插入一条不指定id的记录,会在之前的最后一条记录继续增长 mysql> insert into student(name) values ('大白'); Query OK, 1 row affected (0.00 sec) mysql> select * from student; +----+--------+--------+ | id | name | sex | +----+--------+--------+ | 1 | 老白 | male | | 2 | 小白 | male | | 4 | asb | female | | 7 | wsb | female | | 8 | 大白 | male | +----+--------+--------+ rows in set (0.00 sec) 也可以指定id
mysql> delete from student; Query OK, 5 rows affected (0.00 sec) mysql> select * from student; Empty set (0.00 sec) mysql> select * from student; Empty set (0.00 sec) mysql> insert into student(name) values('ysb'); Query OK, 1 row affected (0.01 sec) mysql> select * from student; +----+------+------+ | id | name | sex | +----+------+------+ | 9 | ysb | male | +----+------+------+ row in set (0.00 sec) #应该用truncate清空表,比起delete一条一条地删除记录,truncate是直接清空表,在删除大表时用它 mysql> truncate student; Query OK, 0 rows affected (0.03 sec) mysql> insert into student(name) values('xiaobai'); Query OK, 1 row affected (0.00 sec) mysql> select * from student; +----+---------+------+ | id | name | sex | +----+---------+------+ | 1 | xiaobai | male | +----+---------+------+ row in set (0.00 sec) mysql> 对于自增的字段,在用delete删除后,再插入值,该字段仍按照删除前的位置继续增长
5 foreign key 外键 建立两张表之间的联系
dep:被关联表(主表) create table dep( id int primary key auto_increment, name varchar(20) not null, des varchar(30) not null ); emp:关联表(从表) create table emp( eid int primary key auto_increment, name char(10) not null, age int not null, dep_id int not null, constraint fk_dep foreign key(dep_id) references dep(id) on delete cascade # 同步删除 on update cascade, # 同步更新 );
变种:
1.先站在表emp的角度 表emp的多条记录对应表dep的一条记录 成立
2.先站在表dep的角度 表dep的多条记录对应表emp的一条记录 成立
多对一 或者 一对多 1和2条件有一个成立
多对多 1和2都成立 通过建立第三张表 来建立多对多的关系
一对一 1和2都不成立,给一个表的fk的字段设置约束unique
create table book( id int primary key auto_increment, name varchar(20) ); create table author( id int primary key auto_increment, name varchar(20) ); create table autho_book( id int primary key auto_increment, book_id int not null, author_id int not null, constraint fk_book foreign key(book_id) references book(id) on delete cascade on update cascade, constraint fk_author foreign key(author_id) references author(id) on delete cascade on update cascade );