数据库的约束
-
约束的介绍和作用
1:约束条件和数据类型一样,都是可选参数 2:约束条件的作用是用于数据的完整性,和数据的一致性
-
主键与常见约束(************)
1:unsigned 无符号的,只对数字有效 2:not null 非空约束 (是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值) #create table t1(name char(10) not null); 3:unique 唯一约束(标识该字段的值是唯一的) #create table t1(name char(10) unique); 4:anto_increment 自动增加(标识该字段的值自动增长(整数类型,而且为主键)) #create table t1(id int primary key auto_increment); 前面必须是个主键key 5:primary key 主键约束,第一个使用not null和unique的字段就会变成主键 #create table t1(id int primary key); 6:default 默认值(字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值) #create table t1(name char(10) not null default 'xx');
-
外键 foreign key references
-
foreign key外键介绍
1:外键就是标明表与表之间的关系 2:表与表之间的关系有三种:一对一.一对多.多对多 3:级联关系 #严格模式(默认的),外键有强制约束效果,被关联字段不能随意删除和修改 #外键有强制约束效果,被关联字段删除或者修改,关联他的那么字段数据会随之删除或者 修改 on update cascade , on delete cascade 级联更新和删除 #set null模式: 被关联字段删除时,关联他的字段数据会置成null #级联set null的示例 mysql> create table tt2(id int primary key auto_increment,name char(10)); mysql> create table tt3(id int,pid int,foreign key(pid) references tt2(id) on delete set null); Query OK, 0 rows affected (1.06 sec) mysql> desc tt3; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | pid | int(11) | YES | MUL | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.01 sec) mysql> insert into tt2(name) values('xx1'),('xx2'); Query OK, 2 rows affected (0.14 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> insert into tt3 values(1,1),(2,1); Query OK, 2 rows affected (0.12 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from tt3; +------+------+ | id | pid | +------+------+ | 1 | 1 | | 2 | 1 | +------+------+ 2 rows in set (0.00 sec) mysql> delete from tt2 where id = 1; Query OK, 1 row affected (0.10 sec) mysql> select * from tt3; +------+------+ | id | pid | +------+------+ | 1 | NULL | | 2 | NULL | +------+------+ 2 rows in set (0.00 sec)
-
外键的作用
1:使表的组织结构变得清晰 2:节省空间 3:增强扩展性 4:保证了数据的安全性和逻辑性 =========== 约束作用: 1:先要建立被关联的表,才能建立关联表 2:再插入数据的时候,要先往被关联表中插入数据,才能往关联表中插入数据 3:更新或者删除的时候都要考虑关联表和被关联表的关系
-
一对多的关系
1:create table dep(id int primary key auto_increment,dep_name char(16) not null);#创建部门表(被关联的表) 2:create table emp(id int primary key auto_increment,name char(10) not null,dep_id int, foreign key(dep_id) references dep(id))#员工表(关联表) ================================ ''' 创建表时,先创建被关联的表,因为关联表中外键的字段数据事来自与被关联的表中的字段,否则就会报错,再插入数据时,也是先再被关联的表中创建数据,先在关联表中创建数据的话,外键是没有值得这样也报错,在修改删除数据时,而是先删除关联表的数据,如果先删除被关联表中的数据,就会报错,原因一样,在关联表中,这个数据被关联着,是无法删除的 有一个解决方案是可以在被关联表中添加两个方法,做到被关联表更新和删除的操作的时候,关联表中同步更新和删除的效果,在申明外键的时候,在后面加上两句话 1:on delete cascade 删除同步 2:on update cascade 更新同步 '''
-
多对多的关系
1:create table author(id int primary key auto_increment,name char(16) not null);#表一 2:create table blook(id int primary key auto_increment,bname char(16) not null);#表二 3:create table author_blook(id int primary key auto_increment,author_id int,book_id int ,foreign key(author_id) references author(id) on update cascade on delete cascade,foreign key(book_id) references book(id) on update cascade on delete cascade);#中间表 ''' 中间表需要指定两个外键,来关联两个表 ''' 多对多的关系,可以查看博客:https://www.cnblogs.com/clschao/articles/9968396.html#_label6
-
一对一的关系
1:create table customer(id int primary key auto_increment,name char(16) not null,phone char(11) not null unique ,qq char(15) not null unique);#表一 2:create table student(id int primary key auto_increment,name char(10) not null , class_name char(15) not null,cid int unique,foreign key(cid) references customer(id));#表二 ''' 一对一的状态下,被关联的字段中的数据只能在关联表中关联一次,所有我们把关联的字段设置成unique 唯一的,这样就不会出现重复的 '''
-
对于查看表关系的总结
#查看表关系的步骤: 1:先从左表的角度去找(条件一) 是否左表的多条记录可以对应右表的一条记录,则证明左表中有一个外键对应右表的一个 字段 2:先从右表的角度去找(条件二) 是否右表的多条记录可以对应左表的一条记录,则证明右表中有一个外键对应左表的一个 字段 #关系总结: 1:如果上面的1条件成立.就是左表多对一右表 2;如果上面的2条件成立,就是右表多对一左表 3:如果两个条件都成立,就是多对多,需要定义一个三方表,来存放两张表的关系 4:如果两个条件都不成立,而是左表的一条数据对应右表的一条数据,就是一对一,那么确 定主从关系,从级表中就回有一个外键指向主表,这个外键要用unique 设置唯一,
-