數(shù)據(jù)表是數(shù)據(jù)庫中最重要、最基本的操作對象,是數(shù)據(jù)存儲的基本單位。數(shù)據(jù)表被定義為列的集合,數(shù)據(jù)在表中是按照行和列的格式來存儲的。每一行代表一條唯一的記錄,每一列代表記錄中的一個域。
創(chuàng)建數(shù)據(jù)表
創(chuàng)建數(shù)據(jù)表,指的是在已創(chuàng)建好的數(shù)據(jù)庫中建立新表。創(chuàng)建的過程是規(guī)定數(shù)據(jù)列的屬性的過程,同時也是實施數(shù)據(jù)完整性(包括實體完整性、引用完整性和域完整性等)約束過程。
普通創(chuàng)建表
create table 表名(
字段名 數(shù)據(jù)類型 [列級別約束條件],
字段名 字段類型 [列級別約束條件],
[表級別約束條件]
);
- 將表掛入到指定的數(shù)據(jù)庫下:
- 在數(shù)據(jù)表名字前面加上數(shù)據(jù)庫名字,用“.”連接即可:數(shù)據(jù)庫.數(shù)據(jù)表
- 在創(chuàng)建數(shù)據(jù)表之前先進入至某個數(shù)據(jù)庫
- 表級別約束條件:與數(shù)據(jù)庫選項似
- Engine:存儲引擎,mysql提供的具體存儲數(shù)據(jù)的方,默認有一個innodb(5.5以前默認是myisam)
- charset:字符集,只對當前自己表有效(級別比數(shù)據(jù)庫高)
- collate:校對集
復(fù)制已有表結(jié)構(gòu)
從已經(jīng)存在的表復(fù)制一份(只復(fù)制結(jié)構(gòu) :如果表中有數(shù)據(jù)不復(fù)制)
create table 新表名 like 表名;
- 表名:使用
數(shù)據(jù)庫.表名,就可以在任何數(shù)據(jù)庫下訪問其他數(shù)據(jù)庫的數(shù)據(jù)表
-- 復(fù)制mydatabase.teacher表結(jié)構(gòu)到teacher
create table teacher like mydatabase.teacher;
使用主鍵約束
主鍵約束(Primary Key Constraint)主鍵和記錄之間的關(guān)系是一一對應(yīng)的。
作用:
- 要求主鍵列的數(shù)據(jù)唯一
- 不允許為空
- 能夠唯一的標識表中的一條記錄
- 可以結(jié)合外鍵來定義不同數(shù)據(jù)表之間的關(guān)系
- 可以加快數(shù)據(jù)庫查詢的速度。
單字段主鍵
- 在定義列的同時指定主鍵
字段名 數(shù)據(jù)類型 primary key [默認值]
-- 將id設(shè)置為主鍵
create table emp(
id int(11) primary key,
name varchar(25)
);
- 定義完所有列之后指定主鍵。
constraint 約束名 primary key [字段名]
- constraint 約束名:可選參數(shù)
-- 將id設(shè)置為主鍵
create table emp{
id int(11),
name varchar(25),
primary key(id)
}
多字段聯(lián)合主鍵
由多個字段聯(lián)合組成一個主鍵
primary key 字段1,字段2,..;
-- 將name和id設(shè)置為主鍵
create table emp(
Id int(11),
name varchar(25),
primary key(name,id)
);
使用外鍵約束
作用: 用來在兩個表的數(shù)據(jù)之間建立關(guān)聯(lián),保證數(shù)據(jù)引用的完整性,一致性
關(guān)聯(lián): 指的是在關(guān)系型數(shù)據(jù)庫中,相關(guān)表之間的聯(lián)系,它是通過相容或相同的屬性或?qū)傩越M來表示。子表的外鍵必須關(guān)聯(lián)父表的主鍵,且關(guān)聯(lián)字段的數(shù)據(jù)類型必須匹配。
使用:
- 它可以是一列或者多列。
- 一個表可以有一個或多個外鍵,但對應(yīng)另外一個表的主鍵
- 定義外鍵后,不允許刪除在另一個表中具有關(guān)聯(lián)關(guān)系的行
- 可以不是本表的主鍵
- 外鍵值必須等于另一個表中主鍵的某個值
- 外鍵可以為空值
- 外鍵必須與主鍵的數(shù)據(jù)類型匹配
主表(父表): 對于兩個具有關(guān)聯(lián)關(guān)系的表而言,相關(guān)聯(lián)字段中主鍵所在的那個表即是主表。
從表(子表): 對于兩個具有關(guān)聯(lián)關(guān)系的表而言,相關(guān)字段中外鍵所在的那個表即是從表
constraint 外鍵名
forelgn key(外鍵字段名1,外鍵字段名2,...)
references 主表名(主鍵列1,主鍵列2,..);
- 外鍵名:為定義的外鍵約束的名稱,一個表中不能有相同名稱的外鍵
- 字段名:表示子表需要添加外鍵約束的字段列
- 主表名:即被子表外鍵所依賴的表的名稱
- 主鍵列:表示主表中定義的主鍵列,或者列組合
-- 創(chuàng)建主表
create table dept(
id int(11) primary key,
name varchar(22) not null,
location varchar(50)
);
-- 創(chuàng)建從表
create table emp(
id int(11) primary key,
name varchar(25),
deptId int(11),
constraint fk_emp_dept1 foreign key(deptId) references dept(id)
);
使用非空約束
非空約束(not null Constraint)指字段不的值不能為空。對于使用了非空約束的字段,如果用戶在添加數(shù)據(jù)時沒有指定值,數(shù)據(jù)庫系統(tǒng)會報錯。
字段名 數(shù)據(jù)類型 not null
create table emp(
id int(11) primary key,
name varchar(25) not null,
deptId int(11)
);
使用唯一性約束
唯一約束(Unique Consraint)要求該列唯一,允許為空,但只能出現(xiàn)一個空值,唯一約束可以確保一列或者幾列不出現(xiàn)重復(fù)值。
unique和primary key的區(qū)別:
- unique:一個表中可以有多個字段聲明為unique,字段允許為空值null的存在。
- primary key:只能有一個primary key,不允許有空值
- 在定義完列之后直接唯一約束,
字段名 數(shù)據(jù)類型 unique
-- 保證name的唯一性
create table dept(
id int(11) primary key,
name varchar(22) unique,
location varchar(50)
);
- 在定義完所有列之后指定唯一約束
constraint 約束名 unique(<字段名>)
- constraint 約束名:可選參數(shù)
create table dept(
id int(11) primary key,
name varchar(22),
location varchar(50),
constraint sth unique(name)
);
使用默認約束
默認約束(Default Constraint)指定某列的默認值。
字段名 數(shù)據(jù)類型 default 默認值
-- 設(shè)置sex默認為男
create table emp(
id int(11) primary key,
name varchar(25) not null,
sex varchar(2) default 男
);
設(shè)置屬性值的自動增加
作用: 每次插入新記錄時,系統(tǒng)自動生成字段的主鍵值
使用:
- 該字段必須為主鍵的一部分
- 一個表只能有一個字段使用
- 默認的初始值是1,新增一條記錄自動加1
- 字段可以是任何整數(shù)類型
字段名 數(shù)據(jù)類型 auto_increment
-- 給id增加自動增加
create table emp(
id int(11) primary key auto_increment,
name varchar(25) not null,
deptId int(11),
salary float
);
查看數(shù)據(jù)表
查看數(shù)據(jù)表列表
顯示所有表
show table
匹配顯示表
show tables like '匹配模式';
查看表基本結(jié)構(gòu)語句describe
describe/desc語句可以查看表的字段信息
describe 表名;
-- 簡寫
desc 表名;
mysql> desc emp;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(10) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
- null:表示該列是否可以存儲null值
- key:表示該列是否已編制索引。PRI表示該列是主鍵的一部分;UNI表示該列是unique索引的一部分;MUL表示在列中基本個給定值允許出現(xiàn)多次。
- default:表示該列是否有默認值,如果有的話值是什么。
- extra:表示可獲取的與給定列有關(guān)的附加信息,例如auto_increment等。
查看表詳細結(jié)構(gòu)語句show create table
show create table語句可以用來顯示創(chuàng)建表時的create table語句。
show create table <表名/G>;
mysql> show create table emp\G;
*************************** 1. row ***************************
Table: emp
Create Table: CREATE TABLE `emp` (
`id` int(10) NOT NULL,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `emp_dept` FOREIGN KEY (`id`) REFERENCES `dept` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
修改數(shù)據(jù)表
修改表指的是修改數(shù)據(jù)庫中已經(jīng)存在的數(shù)據(jù)表的結(jié)構(gòu)
修改表名
alter table 舊表名 rename to 新表名;
- to:為可選參數(shù),使用與否均不影響結(jié)果。
修改字段的數(shù)據(jù)類型
alter table 表名 modify 字段名 數(shù)據(jù)類型;
- 表名:指要修改數(shù)據(jù)類型的字段所有表的名稱
- 字段名:指需要修改的字段
- 數(shù)據(jù)類型:指修改后字段后字段的新數(shù)據(jù)類型
修改字段名
alter table 表名 change 舊字段名 新字段名 新數(shù)據(jù)類型;
- 舊字段名:指修改前的字段名
- 新字段名:指修改后的字段名
- 新數(shù)據(jù)類型:指修改后的數(shù)據(jù)類型,如果不需要修改字段的數(shù)據(jù)類型,可以將新數(shù)類型設(shè)置成與原來一樣,即可,但不能為空。
修改字段的排列位置
alter table 表名 modify 字段1 數(shù)據(jù)類型 first | after 字段2;
- 字段1:指要修改位置的字段,
- 數(shù)據(jù)類型:指“字段1”的數(shù)據(jù)類型,
- first:為可選參數(shù),指將“字段1”修改為表的第一個字段,
- after 字段2:指將“字段1”插入到“字段2”后面。
- 修改字段表的第一個字段
alter table dept modify varchar(12) first;
- 修改字段列表的指定列之后
alter table dept modify column1 varchar(12) after location;
添加字段
alter table 表名 add 新字段名 數(shù)據(jù)類型 約束條件 first | after 已存在字段名;
- first:為可選參數(shù),其作用是將新添加的字段設(shè)置為表的第一個字段;
- after:為可選參數(shù),其作用是將新添加的字段添加到指定的“已存在的字段名”的后面。
- 添加無完整性約束條件的字段
alter table dept add managerId int(10);
- 添加有完整性約束條件的字段
alter table dept add column1 varchar(12) not null;
- 在表的第一列添加一個字段
alter table dept add column2 int(11) first;
- 在表的指定列之后添加一個字段
alter table dept add column3 int(11) after name;
刪除字段
alter table 表名 drop 字段名;
更改表的屬性
alter table 表名 屬性名 更改后的存儲引擎名;
- 屬性名:engine、charset和collate
-- 更表字符集
alter table student charset gbk;
注意: 如果數(shù)據(jù)庫已有很多數(shù)據(jù),不要輕易修改表選項(字符集影響不大)
刪除表的外鍵約束
alter table 表名 drop foreign key 外鍵約束名;
刪除數(shù)據(jù)表
刪除沒有被關(guān)聯(lián)的表
drop table if exists 表1,表2,表n;
刪除被其他表關(guān)聯(lián)的主表
- 直接刪除父表,結(jié)果會顯示失敗,因為直接刪除將會在壞表的參照完整性。
- 先刪除與它關(guān)聯(lián)的子表,再刪除父表,但子表也會被刪除
- 單獨刪除父表,只需要將關(guān)聯(lián)的表的外鍵約束條件取消。
<center color="gray">感謝閱讀,修改建議請下方評論或聯(lián)系作者微信17679391061</center>
primary key約束
-
primary key約束唯一標識數(shù)據(jù)庫表中的每條記錄。 - 主鍵必須包含唯一的值。
- 主鍵列不能包含
null值。 - 每個表都應(yīng)該有一個主鍵,并且每個表只能有一個主鍵。
主鍵
顧名思義:主要的鍵,primary key,在一張表中,有且只有一個字段,里面的值具有唯一性
創(chuàng)建主鍵
隨表創(chuàng)建
系統(tǒng)提個了兩種增加主鍵的方式
- 直接在需要當做主鍵的字段之后,增加primary key 屬性來確定主鍵
-- 在字段之后增加主鍵屬性
create table my_pri1(
username varchar(10) primary key
)charset utf8;
- 有所有字段之后增加 primary key選項:primary key(字段信息)
create table my_pri2(
username varchar(10),
primary key(username)
)charset utf8;
表后增加
alter table my_pri3(
username varchar(10)
)charset utf8;
-- 增加主鍵
alter table my_pri3 add primary key(username);
查看主鍵
- 查看表結(jié)構(gòu)
- 查看表的創(chuàng)建語句
刪除主鍵
alter table 表名 drop primary key;
復(fù)合主鍵
案例:有一張學(xué)生選修課表,一個學(xué)生可以選修多個選修課,一個選修課也可以由多個學(xué)生來選,但是一個學(xué)生在一個選修課中只有一個成績
create table my_score(
student_no char(10),
course_no char(10),
score tinyint not null,
primary key(student_no,course_no)
)charset utf8;
Query OK, 0 rows affected (0.34 sec)
mysql> desc my_score;
+------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+-------+
| student_no | char(10) | NO | PRI | NULL | |
| course_no | char(10) | NO | PRI | NULL | |
| score | tinyint(4) | NO | | NULL | |
+------------+------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
主鍵約束
主鍵一旦增加,那么對對應(yīng)的字段有數(shù)據(jù)要求
- 當前字段對應(yīng)的數(shù)據(jù)不能為空;
- 不前字段對應(yīng)的數(shù)據(jù)不能有任何重復(fù)
主鍵分類
主鍵分類采用的是主鍵所對應(yīng)的字段的業(yè)務(wù)意義分類
- 業(yè)務(wù)主鍵:主鍵所在的字段,具有業(yè)務(wù)意義(學(xué)生ID,課程ID)
- 邏輯主鍵:自然增長的整形(應(yīng)用廣泛)
外鍵概念
如果公共關(guān)鍵字在一個關(guān)系中是主關(guān)鍵字,那么這個公共關(guān)鍵字被稱為另一個關(guān)系的外鍵。由此可見,外鍵表示了兩個關(guān)系之間的相關(guān)聯(lián)系,以另一個關(guān)系的外鍵作為主關(guān)鍵字的表被稱為主表,具有此外鍵的表被稱為主表的從表。外鍵又稱作為關(guān)鍵字。
外鍵:foreign key
一張表(A)中有一個字段,保存的值指向另外一張表(B)的主鍵。
B:主表
A:從表
外鍵操作
增加外鍵
mysql中提供了兩種方式增加外鍵
- 在創(chuàng)建表的時候增加外鍵(類似主鍵)
-- 在字段之后增加外鍵(類似主鍵)
[constraint `外鍵名`] foreign key(外鍵字段) references 主表(主鍵);
- 在創(chuàng)建表后增加外鍵
alter table 從表 add [constraint `外鍵名`] foreign key(外鍵字段) references 主表(主鍵);
修改&刪除外鍵
外鍵不允許修改,只能刪除后增加
alter table my_student drop foreign key 外鍵名字;
如果想刪除對應(yīng)的索引:alter table 表名 drop index 索引名字
外鍵基本要求
- 外鍵字段需要保證與關(guān)聯(lián)的主表的主鍵字段類型完全一致
- 基本屬性也要相同
- 如果是在表后增加外鍵,對數(shù)據(jù)還有一定的要求(從表數(shù)據(jù)與主表的關(guān)聯(lián)關(guān)系)
- 外鍵只能使用innodb存儲引擎:myisam不支持
外鍵約束
外鍵約束:通過建立外鍵關(guān)系之后,對主表和從表都會有一定的數(shù)約束效率。
約束的基本概念
- 當一個外鍵產(chǎn)生時:外鍵所在的表(從表)會受制于劉青青數(shù)據(jù)的存在從而導(dǎo)致數(shù)據(jù)不能進行某些不符合規(guī)范的操作(不能插入主給存在的數(shù)據(jù)):
- 如果一張表被其他表外鍵引入,那么該表的數(shù)據(jù)操作就不能隨意:必須保證從表數(shù)據(jù)的有效性(不能隨便刪除一個被從表引入的記錄)
外鍵約束的概念
可以創(chuàng)建外鍵的,對外鍵約束進行選擇性的操作。
add foreign key(外鍵字段) refereces 主表(主鍵) on 約束模式;
約束模式有三種:
-
districr:嚴格模式,默認的,不允許操作 -
cascade:級聯(lián)模式,一起操作,主要變化,從表數(shù)據(jù)跟著變化 -
set null:置空模式,主表變化(刪除),從表對應(yīng)記錄設(shè)置為空,前提是從表中對應(yīng)的外鍵字段允許為空
外鍵約束主要約束的對象是主表操作:從表就是不能插入主表不存在的數(shù)據(jù)
通常在進行約束的時候,需要指定操作:update和delete
常用的約束模式:on update cascade,on delete set null,更新級聯(lián),刪除置空
約束作用
保證數(shù)據(jù)的完整性:主表與從表的數(shù)據(jù)要一致。
正是因為外鍵有非常強大的數(shù)據(jù)約束作用,而且可能導(dǎo)致數(shù)據(jù)在后臺變化的不可控。導(dǎo)致程序在進行設(shè)計開發(fā)邏輯的時候,沒有辦法去很好的把握數(shù)據(jù)(業(yè)務(wù)),所以外鍵較少使用。
表關(guān)系:表與表之間(實體)有什么樣的關(guān)系,每種關(guān)系應(yīng)該如何設(shè)計表結(jié)構(gòu)
一對一
一對一,一張表中的一條記錄與另外一張表中最多有一條明確的關(guān)系:通常,此設(shè)計方案保證兩張表中使用同樣的主鍵即可
表的使用過程中,常用的信息會經(jīng)常去查詢,而不常用的信息會偶爾才會用到
解決方案:將兩張表拆分,常見的放一張表,不常見的放一張表
一對多(多對一)
一對多,通常也叫作多對一關(guān)系,通常一對多的關(guān)系設(shè)計的方案,在“多”關(guān)系的表中去維護一個字段,這個字段是“一”關(guān)系的主鍵
多對多
多對多:一張表中的一條記錄在另外一張表中可以匹配到多條記錄,反過來也一樣
多對多的關(guān)系如果按照多對一關(guān)系維護:就會出現(xiàn)一樣字段中有多個其他表的主鍵,在訪問的時候就會帶來不便
即然通過兩張表自己增加字段解決不了問題,那么就通過第三張表來解決
師生關(guān)系:
- 一個老師教過多個班級的學(xué)生
- 一個學(xué)生聽過多個老師講的課
首先得有兩個實體:老師表和學(xué)生表
從中間設(shè)計一張表:維護兩張表對應(yīng)的聯(lián)系:每一種聯(lián)系都包含
多對多解決方案:增加一個中間表,讓中間表與對應(yīng)的其他表形成兩個多對一的關(guān)系:多對一的解決文字是在“多”表中增加“一”表對應(yīng)的主鍵字段。
唯一鍵:unique key,用來保證對應(yīng)的字段中的數(shù)據(jù)唯一的。
主鍵也可以用來保證字段唯一性,但是一張表只有一個主鍵
- 唯一鍵在一張表中可以有多個
- 唯一鍵允許字段數(shù)據(jù)為null,null可以有多個(null不參與比較)
創(chuàng)建唯一鍵
創(chuàng)建唯一鍵與創(chuàng)建一主鍵非常類似
- 直接在表字段之后增加唯一鍵標識 符:unique[key]
create table my_uniquel(
id int primary key auto_increment,
username varchar(10) unique
)charset utf8;
- 在所的字段之后使用unique key[字段列表];
create table my_uniquel(
id int primary key auto_increment,
username varchar(10),
unique key(username)
)charset utf8;
- 在創(chuàng)建完表之后也可以增加唯一鍵
create table my_uniquel(
id int primary key auto_increment,
username varchar(10)
)charset utf8;
alter table my_uniquel add unique key(username);
查看唯一鍵
唯一鍵的屬性,可以通過查看表結(jié)構(gòu)來實現(xiàn)
唯一鍵效果:在不為空的情況下,不允許重復(fù)
刪除唯一鍵
alter table 表名 drop index 唯一鍵名字;
修改唯一鍵:先刪除后增加
復(fù)合唯一鍵
唯一鍵與主鍵一樣可以使用多個字段來共同保證唯一性
一般主鍵都單一字段(邏輯主鍵),而其他需要唯一性的內(nèi)容都是由唯一鍵來處理。
自動增長:auto increment,當給定某個字段該屬性之后,該列的數(shù)據(jù)在沒有提供確定數(shù)據(jù)的時候,系統(tǒng)會根據(jù)之前已經(jīng)存在的數(shù)據(jù)進行自動增加后,填充數(shù)據(jù)
原理
自動增長的原理
- 在系統(tǒng)中有維護一組數(shù)據(jù),用來保存當前使用了自動增長屬性的字段,記住當前對應(yīng)的數(shù)據(jù)值,再給定一個指定的步長
- 當用戶進行數(shù)據(jù)插入的時候,如果沒有給定值,系統(tǒng)在原始值上再加上步長變成新的數(shù)據(jù)
- 自動增長的觸發(fā),給定屬性的字段沒有提供值
- 自動增長只適用于數(shù)值
使用自動增長
基本語法:在字段之后增加一個屬性auto increment
create table my_auto(id int primary key auto_increment)charset utf8;
插入數(shù)據(jù),觸發(fā)自動增長,插入空值
insert into my_auto values(null);
修改自動增長
- 查看自增長:自增長一旦觸發(fā)使用之后,會自動的在表選項中增加一個選項(一張表最多只能擁有一個自增長)
alter table my_auto auto_increment = 10;
刪除自增長
刪除自增長:就是在字段發(fā)展之后不再保留 auto_increment,當用戶修改自增長所在字段時,如果沒有看到auto_increment屬性,系統(tǒng)會自動清除該自增長
alter table my_auto modify id int;
初始設(shè)置
在系統(tǒng)中,有一組變量用來維護自增長的初始值和步長
show variables like 'auto_increment%';
細節(jié)問題
- 一張表只有一個自增長,自增長會上升到選項中
- 如果數(shù)據(jù)插入中沒有觸發(fā)自增長(給定了數(shù)據(jù)),那么自增長不會表現(xiàn)
- 自增長修改的時候,值可以較大,但是不能比當前已有的自增長字段的值小