主頁 > 資料庫 > 😎P03 DB 資料庫的約束條件、表關系、修改表語法以及復制表😎

😎P03 DB 資料庫的約束條件、表關系、修改表語法以及復制表😎

2020-09-13 17:46:49 資料庫

內容概要

  • 約束條件
  • 表與表之間建立關系(約束)
  • 修改表的完整語法
  • 復制表

約束條件

default默認值

"""
# 補充:在插入資料的時候可以指定欄位
create table t1 (
    id int, 
    name varchar(16)
);

insert into t1 (name, id) values ('samuel', 1);

create table t2 (
    id int, 
    name varchar(16),
    gender enum('male', 'female', 'others') default 'male'
);

insert into t2 (id, name) values (1, 'samuel');
insert into t2 values (2, 'nagase', 'female');
"""

unique唯一

"""
# 單列唯一
create table t3 (
    id int unique,
    name varchar(16)
);

insert into t3 values (1, 'samuel'), (1, 'nagase');
insert into t3 values (1, 'samuel'), (2, 'nagase');

# 聯合唯一
# ip和port,單個可以重復,但是加在一起必須是唯一的
create table t4 (
    id int, 
    ip varchar(16),
    port int,
    unique (ip, port)
);

insert into t4 values (1, '192.168.1.1', 8000);
insert into t4 values (2, '192.168.1.1', 8001);
insert into t4 values (3, '192.168.1.2', 8000);
insert into t4 values (4, '192.168.1.1', 8000);
"""

primary key主鍵

"""
# 單單從約束效果上來看,primary key等價于not null + unique
# 非空且唯一!!!
create table t5 (
    id int primary key
);

insert into t5 values (null);
insert into t5 values (1), (1);
insert into t5 values (1), (2);

# 它除了有約束效果之外,它還是Innodb存盤引擎在組織資料的依據,
# Innodb存盤引擎在創建表的時候必須有primary key
# 因為它類似于書的目錄,能夠幫助提升查詢效率,并且也是建表的依據

# 1、一張表中,有且只有一個主鍵,如果沒有設定主鍵,那么會從上至下搜索,直到遇到一個非空且唯一的欄位將其升級為primary key
create table t6 (
    id int,
    name varchar(16), 
    age int not null unique, 
    addr varchar(32) not null unique
);
# 2、如果表中沒有主鍵也沒有其他任何的非空且唯一欄位,那么Innodb會采用自己內部提供的一個隱藏欄位作為primary key,隱藏意味著你無法使用它,進而就無法提升查詢效率

# 3、一張表中通常都應該有一個主鍵欄位,并且通常將id作為主鍵
# 單個欄位主鍵
create table t7 (
    id int primary key,
    name varchar(16)
);
# 聯合主鍵(多個欄位聯合起來作為表的主鍵,本質還是一個主鍵)
create table t7 (
    ip varchar(16),
    port int,
    primary key (ip, port)
);
"""

auto_increment自增

"""
# 當編號特別多的時候,人為的去維護太過繁瑣,因此這就涉及到了自增
create table t8 (
    id int primary key auto_increment,
    name varchar(16)
);

insert into t8 (name) values ('samuel'), ('nagase'), ('matthew');
# 注意:auto_increment通常都是加在primary key鍵上,不能給普通欄位加
"""

補充:洗掉表的兩種方法

"""
delete from 表名

truncate 表名
"""

兩種方法的區別:delete from 表名這種方法,在洗掉表中資料的時候,主鍵的自增不會停止,會繼續編號

然而,truncate 表名這種方式,除了清空資料表之外還會重置主鍵的自增,使其從1重新開始

表與表之間建立關系

"""
# 定義了一張員工表 表中有很多欄位
# id name gender dep_name dep_desc

# 分析目前的表所存在的問題:
# 1、該表的組織結構不是很清晰
# 2、浪費磁盤空間
# 3、資料的擴展性極差

# 那么該如何優化呢?那么多的欄位全部寫在了一張表里,那就相當于把所有的代碼全部寫在一個檔案中,這樣是有極大問題的,
# 因此我們應該將該表拆分為:員工表和部門表
"""

外鍵約束

# 外鍵就是用來幫助我們建立表與表中間關系的
foreign key

表與表之間的關系

# 表與表之間的關系只有4種

# 一對多關系
    # 注意:在MySQL中,沒有多對一關系這么一說,一對多、多對一 ,都是一對多
# 多對多關系
# 一對一關系
# 沒有關系

一對多關系

"""
判斷表與表中間關系的時候,一定要一步一步的判斷,使用正確的方法,那就是
“換位思考”分別站在兩張表的角度考慮問題

比如:員工表與部門表
先站在員工表
    思考一個員工能夠對應多個部門------不能!!!
再站在部門表
    思考一個部門可以不可以包含多個員工-------可以!!!
得出結論:
    員工表與部門表表示單向的一對多,所以表關系就是一對多,
"""
foreign key
【原則1】一對多關系的表 外鍵欄位要建立在多的那一方
【原則2】在創建表的時候,一定要先創建被關聯的那一方

# SQL陳述句
create table dep (
    id int primary key auto_increment,
    dep_name varchar(16),
    dep_desc varchar(32)
);

create table emp (
    id int primary key auto_increment,
    name varchar(16), 
    gender enum('male', 'female', 'others') default 'male',
    dep_id int,
    foreign key (dep_id) references dep (id)
);

insert into dep (dep_name, dep_desc) values ('教學部', '教書育人'), ('技術部', '技術能力有限'), ('外交部', '外交');

insert into emp (name, dep_id) values ('samuel', 2), ('nagase', 1), ('matthew', 1), ('garnet', 3);

# 修改dep表的id欄位
update dep set id = 200 where id = 2;    操作失敗

# 洗掉dep表里的資料
delete from dep;    操作失敗

以上兩個陳述句都失敗了,是因為dep表被emp表所參考,因此,dep表不可以被洗掉,解決辦法如下:
# 1、先洗掉教學部對應的員工資料,之后再洗掉部門
 這樣做太過繁瑣

# 2、真正做到資料之間有關系,更新就同步更新,洗掉就同步洗掉
# 那也就是級聯更新、級聯洗掉,那么如何做到呢???
# 解決辦法:在創建表的時候添加額外的約束
create table dep (
    id int primary key auto_increment,
    dep_name varchar(16),
    dep_desc varchar(32)
);

create table emp (
    id int primary key auto_increment,
    name varchar(16),
    gender enum('male', 'female', 'others') default 'male',
    dep_id int,
    foreign key(dep_id) references dep(id) on update cascade on delete cascade
);

多對多關系

"""
判斷表與表之間關系的時候,一定要使用正確的方法,那就是“換位思考”,分別站在兩張表的角度考慮

例如:圖書表與作者表
先站在圖書表的角度考慮,思考一個圖書可不可以有多個作者-----可以!!!
再站在作者表的角度考慮,思考一個作者可不可以出版多本圖書----可以!!!
得出結論:
圖書表與作者表是雙向的一對多,所以表關系就是“多對多”關系
"""
create table book (
    id int primary key auto_increment,
    title varchar(32),
    price int, 
    author_id int,
    foreign key(author_id) references author(id) on update cascade on delete cascade
);

create table author (
    id int primary key auto_increment,
    name varchar(32), 
    age int, 
    book_id int, 
    foreign key(book_id) references book(id) on update cascade on delete cascade
);

# 如果按照以上的陳述句創建表,結果是:::失敗的!!!
回想我們的兩大原則:
【原則1】針對于一對多關系的表,外鍵欄位要建立在多的那一方
【原則2】在創建表的時候,一定要先創建被關聯的那一方
針對于圖書表與作者表,圖書表參考了作者表的id,對于圖書表來說,作者表是被關聯的那一方;那么反過來,對于作者表來說,圖書表是被關聯的那一方,如此一來,雙方都是被關聯的那一方,那,,,,怎么辦,,,雙方就這么拖著,,,于是乎兩張表均創建失敗!!!

# 其實我們只是想記錄圖書與作者的關系
# 針對多對多的關系,不能在兩張原表中創建外鍵
# 我們需要單獨創建一張表出來專門用于存盤兩張表之間的關系
create table book (
    id int primary key auto_increment,
    title varchar(16),
    price int
);

create table author (
    id int primary key auto_increment, 
    name varchar(16), 
    age int
);

create table book2author (
    id int primary key auto_increment, 
    book_id int, 
    author_id int,
    foreign key(book_id) references book(id) on update cascade on delete cascade,
    foreign key(author_id) references author(id) on update cascade on delete cascade
);

一對一關系

"""
id name age gender addr phone hobby email...
如果一張表的欄位特別多,每次查詢又不是所有的欄位都能用到,于是我們將表一分為二
用戶表
    id name age
用戶詳情表
    id addr phone hobby email...

“換位思考”的方法:
先站在用戶表的角度考慮:一個用戶能否對應多個用戶詳情----不可以!!!
再站在用戶詳情的角度考慮:一個用戶詳情是否屬于多個用戶---不可以!!!
得出結論:單向的一對多都不成立,那么這個時候兩者之間的關系要么就是一對一的關系要么就是沒有關系
注意,針對于一對一的關系,外鍵欄位要建立在查詢頻率高的那張表中
"""
create table user_detail (
    id int primary key auto_increment,
    phone int,
    addr varchar(64)
);

create table user (
    id int primary key auto_increment,
    name varchar(16),
    age int,
    user_detail_id int unique,
    foreign key(user_detail_id) references user_detail(id) on update cascade on delete cascade 
);

總結

"""
表關系的創建需要用到foreign key
    一對多
        外鍵欄位建立在多的一方
    多對多
        自己開設第三張表
    一對一
        建立在任意一張表中都可以,但是建議在查詢頻率高的表中建立
        
建立表之間關系的方式
    換位思考!!!
        員工 與 部門
        圖書 與 作者
        用戶 與 用戶詳情
"""

修改表

# MySQL對大小寫是不敏感的
# 1、修改表名
alter table 表名 rename 新表名;

# 2、增加欄位
alter table 表名 add 欄位名 欄位型別(寬度) 約束條件; # 默認是加在表的最后
alter table 表名 add 欄位名 欄位型別(寬度) 約束條件 first; # 加在表的開頭
alter table 表名 add 欄位名 欄位型別(寬度) 約束條件 after 欄位名; # 手動說明要加在哪里

# 3、洗掉欄位
alter table 表名 drop 欄位名;

# 4、修改欄位
alter table 表名 modify 欄位名 欄位型別(寬度) 約束條件;
alter table 表名 change 舊欄位名 新欄位名 欄位型別(寬度) 約束條件;

復制表

# 我們在執行SQL陳述句的時候,顯示的結果是一張虛擬的表
create table 新表名 select * from 表名; # 但是不可以復制主鍵、外鍵、索引...只是復制了結構和資料而已

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/26195.html

標籤:MySQL

上一篇:===========SQL Server 磁區表的問題===================

下一篇:求資料庫系統課設檔案 小區物業管理系統

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more