标签:解决方案 cas 插入数据 author log ble null 介绍 无符号
约束的介绍和作用
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外键介绍
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 设置唯一,
标签:解决方案 cas 插入数据 author log ble null 介绍 无符号
原文地址:https://www.cnblogs.com/luckinlee/p/11621148.html