mysql3约束条件/主键/外键/一对一/多对多/一对多
- mysql 约束条件
- 约束条件之外键
- Forgign Key
- 表关系之多与多
- 表关系之一对一
mysql 约束(constraint)条件
-
主键(primary key)
主键约束是在表中定义一个主键来唯一确定表中每一行数据的标识符 (非空,唯一)
create table test1( id int primary key, name varchar(32) );
-
主键特点
非空(not null)且唯一(unique)
-
innodb引擎例子
2.Innodb存储引擎规定一张表必须有且只有一个主键 2.1如果创建的表中没有主键也没有非空且唯一的字段那么innodb存储会自动采用一个隐藏的字段作为主键(主键可以加快数据查询 InnoDB会选择内置6字节长的ROWID作为隐含的聚簇索引。 ---------------------------------------------------- 2.2 如果创建的表中没有主键但是有非空且唯一的字段,那么innodb存储引擎自动将该字段设置为主键
实战例子:
#非空且唯一 create table test_db2( -> nid int not null unique, -> nid int not null unique, -> uid int not null unique, -> name varchar(32) -> ); ---------------------------------------- mysql> desc test_db2; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | nid | int(11) | NO | PRI | NULL | | | sid | int(11) | NO | UNI | NULL | | | name | varchar(32) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+
-
自增(auto_increment)
-
该约束条件不能单独使用,必须跟在键后面(主要配合主键一起使用)
--------------------------------------------------- mysql> create table test_db4( -> id int primary key auto_increment, -> name varchar(32) -> ); Query OK, 0 rows affected (0.02 sec) mysql> desc test_db4; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(32) | YES | | NULL | | +-------+-------------+------+-----+---------+----------------+ 2 rows in set (0.01 sec)
-
自增特点
1.自增的操作不会因为删除数据的操作,而回退或者重置 2.如果非要重置主键,需要格式化表 truncate 表名; #删除表数据并重置主键值
约束条件之外键
外键:
专门用于记录表与表直接的数据的关系,数据与数据的关系有四种
关系 | |
---|---|
一对多关系 | 部门与员工的关系 |
多对多关系 | 书籍与作者的关系 |
一对一关系 | 聊天软件与用户信息展示关系 |
Foreign Key
#外键书写小技巧
1.先写普通字段
2.然后再写外键字段
1.创建表的时候需要先创建被关联的表(没有外键)然后再是关联表(有外键)
2.插入表数据的时候,针对外键字段只能天蝎被关联表字段已经出现过的数据值
3.被关联字段无法修改和删除【这里使用级联删除,级联更新。】
有点不太好,操作限制性太强
一对多
针对一对多的关系,外键建在多的一方
#例子
create table emp1(
id int primary key auto_increment,
name varchar(32),
gender enum('male','female','others') default 'male',
dep_id int,
foreign key(dep_id) references dep1(id)
on update cascade # 级联更新
on delete cascade # 级联删除
);
create table dep1(
id int primary key auto_increment,
dep_name varchar(32),
dep_desc varchar(32)
);
多对多
针对多对多的关系,外键字段不能建在任意乙方,需要单独开设第三张关系表,存储数据关系
-
例子
书籍与作者 create table book( id int primary key auto_increment, title varchar(32) ); create table author( id int primary key auto_increment, name varchar(32) ); create table book2author( id int primary key auto_increment, book_id int, foreign key(book_id) references book(id) on update cascade # 级联更新 on delete cascade, # 级联删除 author_id int, foreign key(author_id) references author(id) on update cascade # 级联更新 on delete cascade # 级联删除 );
一对一
一对一关系表,外键字段建在任何一张表都可以 但是建议你建在查询频率较高的表中便于后续查询
例子
create table user(
id int primary key auto_increment,
name varchar(32),
detail_id int unique, #一对一,唯一性
foreign key(detail_id) references userDetail(id)
on update cascade # 级联更新
on delete cascade # 级联删除
);
create table userDetail(
id int primary key auto_increment,
phone bigint
);