MySQL数据库之-foreign key 外键(一对多、多对多、一对一)、修改表、复制表
生活随笔
收集整理的這篇文章主要介紹了
MySQL数据库之-foreign key 外键(一对多、多对多、一对一)、修改表、复制表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
閱讀目錄
- 一、引言:
- 二、一對多(foreign key)
- 三、多對多:
- 四、一對一:
- 五、修改表:
- 六、復制表:
摘要:
一、引言:
我們在同一數據庫創建的表時候,很多時候會出現相同數據的冗余問題,也就是說幾個id會有一個或者同n個相同字段,這樣就導致數據表結構數據重復冗余,
冗余還無所謂,關鍵是如果我要改其中一個相同的字段信息,其他跟他相同字段的信息也都要同步修改,這就增加了很多工作量,特別是如果要處理大量數據的時候
所以需要有一種解決方式來處理這種顯而易見的問題。
例如:
很顯然,上表的id為2/3/4的人員同屬于一個字段名(部門)教育部,部門描述也是一樣。解決方法:拆分為2個表
二、一對多(foreign key)
foreign key 會將本表中的一個字段與另外一個表的字段(通常是主鍵字段)進行關聯。
在創建表時,必須先建被關聯的表dep,才能建關聯表emp create database foreign_ts; # 創建數據庫 use foreign_ts; # 進入數據庫 # 先創建被關聯表: create table dep(id int primary key auto_increment, # 設置主鍵,自增長dep_name char(16),dep_desc char(16));# 再創建關聯表emp: create table emp(id int primary key auto_increment, # 設置主鍵,自增長name char(16),gender enum('male','female','others'),dep_id int,foreign key(dep_id) references dep(id) # 外鍵 關聯on update cascade # 同步更新on delete cascade # 同步刪除);# 插入數據: 在插入記錄時,必須先插入被關聯的表dep,才能插關聯表emp insert into dep(dep_name,dep_desc) values('外交部','形象代言人'),('教育部','教書育人'),('技術部','技術能力有限部門');insert into emp(name,gender,dep_id) values ('jason','male',1), ('egon','male',2), ('kevin','male',2), ('tank','male',2), ('jerry','female',3);三、多對多
一對多是A表中多個字段關聯B表中一個字段。
而多對多就是在此基礎上B表中也有多個字段關聯A表中一個字段。
此時如果依然以上面一對多的形式去創建表格的話,就會出現互相矛盾的問題,也就是我再關聯你的時候你還沒有被創建的情況。
示例:
# 圖書表與作者表之間的關系 """ 仍然站在兩張表的角度: 1.站在圖書表:一本書可以有多個作者 2.站在作者表:一個作者可以寫多本書 雙方都能一條數據對應對方多條記錄,這種關系就是多對多! """ # 先來想如何創建表?圖書表需要有一個外鍵關聯作者,作者也需要有一個外鍵字段關聯圖書。問題來了,先創建誰都不合適!如何解決? # 建立第三張表,該表中有一個字段fk左表的id,還有一個字段是fk右表的id ---------------------------------- 先將2個表建起了: mysql> create table author( #建作者表,id和name足以-> id int primary key auto_increment,-> name char(16)-> );mysql> create table book( # 建書表,id、書名、價格-> id int primary key auto_increment,-> title char(16),-> price int-> ); 插入表數據: mysql> insert into author(name) values-> ('唐家三少'),-> ('金庸'),-> ('蕭鼎')-> ;mysql> insert into book(title,price) values-> ('光之子',99),-> ('冰火魔廚',88),-> ('斗羅大陸',77),-> ('倚天屠龍記',98),-> ('神雕俠侶',96),-> ('誅仙',100); mysql> select* from author; # 查看建表結果 +----+--------------+ | id | name | +----+--------------+ | 1 | 唐家三少 | | 2 | 金庸 | | 3 | 蕭鼎 | +----+--------------+ mysql> select* from book; # 查看建表結果 +----+-----------------+-------+ | id | title | price | +----+-----------------+-------+ | 1 | 光之子 | 99 | | 2 | 冰火魔廚 | 88 | | 3 | 斗羅大陸 | 77 | | 4 | 倚天屠龍記 | 98 | | 5 | 神雕俠侶 | 96 | | 6 | 誅仙 | 100 | +----+-----------------+-------+ -------------------------------------------------------------------------- 建立第三張表,這張表作用就是關聯author表和book表。 mysql> 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 # 設置外鍵-> ); # 插入關聯數據 mysql> insert into book2author(book_id,author_id) values-> (1,1),-> (2,1),-> (3,1),-> (4,2),-> (5,2),-> (6,3); # 查看結果: mysql> select * from book2author; +----+---------+-----------+ | id | book_id | author_id | +----+---------+-----------+ | 1 | 1 | 1 | | 2 | 2 | 1 | | 3 | 3 | 1 | | 4 | 4 | 2 | | 5 | 5 | 2 | | 6 | 6 | 3 | +----+---------+-----------+這樣就將book表和author表之間通過第三張表建立了多對多外鍵關聯。四、一對一:
A表的字段與B表中的某一唯一字段形成一對一的關聯
示例:
# 我們可以通過客戶表和投保人之間的關系來描述一對一 保險銷售人員有個客戶表,在每天的不斷努力經營客戶之下,促進了多個客戶成為了投保人,這個多個投保人作為一張投保人表,他們之間的關系可以說是一對一關系: 或者說是一種類似于集合的父集與子集的關系。 mysql> create table customer(-> id int primary key auto_increment,-> name char(16),-> age int,-> sex enum('male','female','other'),-> wechart char(16)-> );mysql> create table holder( # 創建投保人表-> id int primary key auto_increment,-> name char(16),-> holder_price int,-> customer_id int unique, # 將客戶id設為唯一,因為客戶表中客戶id必須唯一-> foreign key(customer_id) references customer(id) on update cascade on delete cascade-> ); # 客戶id與客戶表中id進行關聯。同步改刪 -------------------------------------------------- 插入數據:(先插入客戶表(被關聯),再插入投保人表) mysql> insert into customer(name,age,sex,wechart) values-> ('張三豐',18,'male','17375898'),-> ('張小凡',16,'male','65652456'),-> ('陸雪琪',17,'female','62612384'),-> ('秦祥林',25,'male','545654655'),-> ('至尊寶',999,'male','66666666'),-> ('韋小寶',30,'male','475247124');mysql> insert into holder(name,holder_price,customer_id) values-> ('張小凡',5000000,2),-> ('陸雪琪',10000000,3),-> ('韋小寶',990000,6);# 查看結果: mysql> select * from customer; +----+-----------+------+--------+-----------+ | id | name | age | sex | wechart | +----+-----------+------+--------+-----------+ | 1 | 張三豐 | 18 | male | 17375898 | | 2 | 張小凡 | 16 | male | 65652456 | | 3 | 陸雪琪 | 17 | female | 62612384 | | 4 | 秦祥林 | 25 | male | 545654655 | | 5 | 至尊寶 | 999 | male | 66666666 | | 6 | 韋小寶 | 30 | male | 475247124 | +----+-----------+------+--------+-----------+ mysql> select * from holder; +----+-----------+--------------+-------------+ | id | name | holder_price | customer_id | +----+-----------+--------------+-------------+ | 1 | 張小凡 | 5000000 | 2 | | 2 | 陸雪琪 | 10000000 | 3 | | 3 | 韋小寶 | 990000 | 6 | +----+-----------+--------------+-------------+五、修改表:
語法: 1. 修改表名ALTER TABLE 表名 RENAME 新表名;2. 增加字段ALTER TABLE 表名ADD 字段名 數據類型 [完整性約束條件…],ADD 字段名 數據類型 [完整性約束條件…];ALTER TABLE 表名ADD 字段名 數據類型 [完整性約束條件…] FIRST;ALTER TABLE 表名ADD 字段名 數據類型 [完整性約束條件…] AFTER 字段名; 3. 刪除字段ALTER TABLE 表名 DROP 字段名; 4. 修改字段ALTER TABLE 表名 MODIFY 字段名 數據類型 [完整性約束條件…];ALTER TABLE 表名 CHANGE 舊字段名 新字段名 舊數據類型 [完整性約束條件…];ALTER TABLE 表名 CHANGE 舊字段名 新字段名 新數據類型 [完整性約束條件…];六、復制表:
在創建表的時候 通過select * from 表名 來獲取復制表的來源
# 復制表結構+記錄 (key不會復制: 主鍵、外鍵和索引) create table new_service select * from service;# 只復制表結構 select * from service where 1=2; //條件為假,查不到任何記錄create table new1_service select * from service where 1=2; create table t4 like employees;總結
以上是生活随笔為你收集整理的MySQL数据库之-foreign key 外键(一对多、多对多、一对一)、修改表、复制表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL数据类型与操作
- 下一篇: MySQL之单表查询、多表查询(一)