目錄
1、數據類型
1.1、日期和時間類型
1.2、enum和set
2、表的約束
2.1、空屬性
2.2、默認值(default)
2.3、列描述(comment)
2.4、zerofill
2.5、主鍵(primary key)
2.6、自增長(auto_increment)
2.7、唯一鍵(unique)
2.8、外鍵
1、數據類型
1.1、日期和時間類型
創建表:
mysql> create table birthday (
t1 date, //日期
t2 datetime, //日期時間
t3 timestamp //時間戳
);
插入數據:
mysql> insert into birthday(t1,t2) values('1997-7-1','2008-8-8 12:1:1');
--插入兩種時間
插入數據的時候,時間戳自動補上時間。更新數據時,時間戳也會更新時間。
1.2、enum和set
enum(枚舉)是單選(多選一),插入的數據必須是枚舉值中的一個,可以使用下標進行插入數據,並且下標是從1開始。
set(集合)是多選(多選一或多選),這個是位圖不是下標;
mysql> create table votes(
-> username varchar(30),
-> hobby set('登山','游泳','籃球','武術'), --注意:使用數字標識每個愛好的時候,想想
Linux權限,採用比特位位置來個set中的愛好對應起來
-> gender enum('男','女'));
使用find_in_set‘可以查詢出所有愛好包含羽毛球的人
select * from votes where find_in_set('羽毛球’,bobby);
2、表的約束
表的約束:表中一定要有各種約束,通過約束,讓我們未來插入數據庫中的數據是符合預期的。約束本質是通過技術手段,倒逼程序員,插入正確的數據。反過來,站在mysql的視角,凡是插入進來的數據,都是符合數據約束的。
2.1、空屬性
創建一個班級表,包含班級名和班級所在的教室。
站在正常的業務邏輯中:
如果班級沒有名字,你不知道你在哪個班級
如果教室名字可以為空,就不知道在哪上課
所以我們在設計數據庫表的時候,一定要在表中進行限制,滿足上面條件的數據就不能插入到表中。這就是“約束”。
2.2、默認值(default)
某個數據會經常性的出現某個具體的值,可以在一開始就制定好,需要數據的時候用户可以進行選擇性的使用默認值。
默認值生效就是在插入數據的時候對此列不進行插入。
2.3、列描述(comment)
desc不能看到列描述
show create table 表名\G 可以看到列描述
2.4、zerofill
字符串類型---char、varchar 括號裏的數字=存儲的最大字符數(存儲限制)
數值類型---- int 、bigint 括號裏的數字=顯示寬度(僅影響顯示,不影響存儲)
decimal(m,n)是特殊數值類型:m和n限制數值的總位數和小數位數(影響存儲和精度)。
2.5、主鍵(primary key)
有了主鍵,表中就不會出現相同的兩行數據。
但是主鍵的唯一性約束只針對主鍵字段本身,而不是整行所有字段-----主鍵不同,但是其他列相同,表也是允許插入的。
創建唯一性約束:
- 如果你不希望出現任何業務數據重複的行,正確的做法不是單靠主鍵,而是給所有需要保證唯一的列創建一個
UNIQUE約束。ALTER TABLE 學生表 ADD CONSTRAINT unique_student_info UNIQUE (學號, 姓名, 年齡);
2.6、自增長(auto_increment)
當對應的字段不給值,就會自動被系統觸發,會從當前的最大值+1,得到一個新的值,通常和主鍵搭配使用,作為邏輯主鍵。
索引:主鍵是身份證,索引就是目錄。
主鍵和索引的關係,主鍵都是索引但是並非索引都是主鍵。
主鍵是身份證,索引就是目錄
主鍵和索引的關係:
1、主鍵首先是一個“唯一且非空”的索引,然後他還被賦予了“唯一標識符“這個身份。
2、創建主鍵時,數據庫在做什麼??
當你為一張表創建了一個主鍵,數據庫會隱式創建一個唯一索引;強制實施主鍵約束(確保所有插入和更新的數據都滿足唯一且非空的條件)
我們不需要手動再為主鍵創建一個索引,因為他已經自帶了。
3、為什麼通過主鍵查詢最快?
主鍵自帶索引
4、選擇合適的主鍵:因為主鍵自帶索引,因此選擇一個短小、連續、不經常更改的列作為主鍵對性能非常有利。
2.7、唯一鍵(unique)
一張表中只能有一個主鍵,但是往往有很多字段需要唯一性,數據不能重複。唯一鍵就能解決表中有多個字段需要唯一性約束的問題。
唯一鍵不能重複,但可以為空
唯一鍵和主鍵的區別:
主鍵更多的是標識唯一性。而唯一鍵更多的是保證在業務上,不要和別的出現重複。eg:員工管理系統---身份號(主鍵)和員工工號(唯一鍵),員工工號不能重複。
一般而言,我們建議將主鍵設計成為和當前業務無關的字段,這樣,當業務調整的時候,我們可以儘量不會對主鍵做過大的調整。
2.8、外鍵
外鍵用於定義主表和從表之間的關係,外鍵約束主要定義在從表上,主表則必須是有主鍵約束或unique約束。
當定義外鍵後,要求外鍵列數據必須在主表的主鍵列存在或為null主表中被外鍵關聯的列(通常是主鍵,但可以是具有唯一約束的列)
通常情況下,外鍵關聯主表的主鍵。
---實際業務中,外鍵幾乎都是關聯主表的主鍵(PRIMARY KEY)。因為主鍵本身具有唯一性和非空性,能確保被關聯的列值是唯一且確定的,符合外鍵對 “關聯目標必須唯一可識別” 的要求。
特殊情況,外鍵也可以關聯主表的唯一鍵(unique)
---數據庫允許外鍵關聯主表中具有唯一約束(UNIQUE)且非空(NOT NULL)的列(即唯一鍵)。因為唯一鍵也能保證列值的唯一性,滿足外鍵關聯的 “目標值必須唯一存在” 的核心需求。
簡單來説,外鍵約束就是數據庫用來維護現實世界中各種關係(如母子關係、部門-員工關係、訂單-商品關係)不出現邏輯錯誤的核心機制。
查詢結果去重: