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