首页 > 数据库技术 > 详细

MySQL 外键 一对一 一对多 多对多 复制

时间:2019-08-20 17:33:52      阅读:230      评论:0      收藏:0      [点我收藏+]
# 外键

## 1,学习外键首先要明白表与表之间的关系

?                首先要换位思考 在考虑了这边 还要考虑另一边

?                然后在下定论

###     判断表关系的语法

####             图书与出版社

?                一本书可不可以有多个出版社 不可以

?                一个出版社可不可以出版多本书  可以

?                这就是一对多关系 

####             图书与作者

?                一本书可不可以有多个作者   可以

?                一个作者可不可以写多本书   可以

?                多对多的关系

###             作者与作者信息

?            一个作者可不可以有多个个人信息 不可以 

?            一个作者的个人信息能不能有多个作者  不可以

?            要么两个是一对一,要么没关系

primary key 主键约束,该约束的意思就是,该字段的值非空且不能重复

关键字 references 建立表与表之间的关系

foreign key 外键约束,意思就是该字段与另外一张表有联系.好比儿子必定有爸爸,要是有人想把爸爸K掉,儿子就肯定不干了!反之没儿子的人如果要被K,就没人管啦

## 2,一对多

?    #foreign key会带来什么效果

?    1,在创建表的时候,先创建 被关联的表不带有foreign key

?    创建完在创建带有foreign key 

```python
create table dep(
id int primary key auto_increment,
dep_name char(10),
dep_comment char(60)
);

create table emp(
id int primary key auto_increment,
name char(15),
gender enum(male,female) not null default male,
dep_id int,
foreign key (dep_id) references dep(id) 给这个dep_ip传入的id必须是
    另一个表的id 而 referencnces 就是链接起另一张表 dep 里面一般都放的是令一张表的主键 且在给dep_id 传值的时候必须是另一张表有的id 如果没有就报错
on update cascade
on delete cascade
);

insert into dep (dep_name,dep_comment) values
(教学部,辅导学生,教授python),
(外交,中国形象大屎),
(技术部门,技术能力有限部门);

insert into emp (name,gender,dep_id) values
(jason,male,1),
(egon,male,2),
(taken,female,3);


```







## 3,多对多

```python
# 图书表与作者表之间的关系
"""
仍然站在两张表的角度:
1.站在图书表:一本书可不可以有多个作者,可以!那就是书多对一作者
2.站在作者表:一个作者可不可以写多本书,可以!那就是作者多对一书
双方都能一条数据对应对方多条记录,这种关系就是多对多!
"""
# 先来想如何创建表?图书表需要有一个外键关联作者,作者也需要有一个外键字段关联图书。问题来了,先创建谁都不合适!如何解决?
# 建立第三张表,该表中有一个字段fk左表的id,还有一个字段是fk右表的id
create table author (
id int primary key auto_increment,
name char(10));

create table book(
id int primary key auto_increment,
bname char(10),
price int);
insert into author (name) values
(egon),
(jason),
(yangxin),
(alex);

insert into book (bname,price) values
(php从入门到消失,1000),
(葵花宝典,553),
(小泽玛利亚大战苍井空,200009),
(小泽精选,20000),
(小仓精选,2222);

create table author2book(
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 author(id)
on update cascade
on delete cascade);

insert into author2book(author_id,book_id) values
(1,2),
(2,3),
(3,4),
(1,4),
(4,2);

```



## 4,一对一



用户名 和用户信息

?    

```python
左边的表记录唯一对应右边的一条记录,反之也一样
create table username(
    id int primary key auto_increment,
    name char(10) not null,
    age int not null);
insert into username(name,age) values
(jason,98),
(yangxin,18),
(wukai,10);

create table card(
    id int primary key auto_increment,
    identity int unique,#该字段唯一
    username_id int unique,#该字段唯一
    foreign key (card_id) references username(id)
    on delete cascade
    on update cascade);
insert into card(identity,username_id) values
(170020,1),
(125435,2),
(146547,3);
```

## 5修改表

```python
# mysql对大小写不敏感!!!
语法:
1. 修改表名                
        ALTER TABLE 表名
                    RENAME 新表名;
2. 增加字段      
        ALTER TABLE 表名
                   ADD 字段名  数据类型 [完整性约束条件…],                               ADD 字段名  数据类型 [完整性约束条件…];
         ALTER TABLE 表名
                    ADD 字段名  数据类型 [完整性约束条件…]  FIRST;            ALTER TABLE 表名
                ADD 字段名  数据类型 [完整性约束条件…]  AFTER 字段名;  3. 删除字段      
         ALTER TABLE 表名 
                DROP 字段名;
 4. 修改字段  # modify只能改字段数据类型完整约束,不能改字段名,但是change可以!      
            ALTER TABLE 表名                           
                    MODIFY  字段名 数据类型 [完整性约束条件…];     
            ALTER TABLE 表名 
                     CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];      ALTER TABLE 表名                          
                CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
```

## 6复制表

?    

```python
#复制表 语法 create table 表名 select *from 被复制的表名
#只能复制表的结构+记录 不会复制 主键 外键 和索引
```

 

MySQL 外键 一对一 一对多 多对多 复制

原文:https://www.cnblogs.com/yangxinpython/p/11383986.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!