MySQL 外鍵 一對一 一對多 多對多 復制


# 外鍵

## 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 被復制的表名
#只能復制表的結構+記錄 不會復制 主鍵 外鍵 和索引
```

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM