詳解mysql基本操作詳細(二)
阿新 • • 發佈:2020-01-09
前言
本文類容
1、資料庫的幾大約束
2、表與表之間的關係
約束:
主鍵約束:
作用:為了保證資料的有效性和完整性 mysql中常用的約束:主鍵約束(primary key) 唯一約束(unique) 非空約束(not null) 外來鍵約束(foreign key) 主鍵約束:被修飾過的欄位唯一非空 注意:一張表只能有一個主鍵,這個主鍵可以包含多個欄位 方式1:建表的同時新增約束 格式: 欄位名稱 欄位型別 primary key 方式2:建表的同時在約束區域新增約束 所有的欄位宣告完成之後,就是約束區域了 格式: primary key(欄位1,欄位2) create table pk01( id int,username varchar(20),primary key (id) ); insert into pk01 values(1,'tom');-- 成功 insert into pk01 values(1,'tom');-- 失敗 Duplicate entry '1' for key 'PRIMARY' insert into pk01 values(null,'tom');-- 失敗 Column 'id' cannot be null create table pk01( id int primary key,primary key (id) );-- 錯誤的 一張表只能有一個主鍵 方式3:建表之後,通過修改表結構新增約束 create table pk02( id int,username varchar(20) ); alter table pk02 add primary key(欄位名1,欄位名2..); alter table pk02 add primary key(id,username); insert into pk02 values(1,'tom');-- 成功 insert into pk02 values(1,'tomcat');-- 成功 insert into pk02 values(1,'tomcat');-- 失敗
唯一約束
被修飾過的欄位唯一,對null不起作用 方式1:建表的同時新增約束 格式: 欄位名稱 欄位型別 unique create table un( id int unique,username varchar(20) unique ); insert into un value(10,'tom');-- 成功 insert into un value(10,'jack');-- 錯誤 Duplicate entry '10' for key 'id' insert into un value(null,'jack');-- 成功 insert into un value(null,'rose');-- 成功 方式2:建表的同時在約束區域新增約束 所有的欄位宣告完成之後,就是約束區域了 unique(欄位1,欄位值2...) 方式3:建表之後,通過修改表結構新增約束 alter table 表名 add unique(欄位1,欄位2);-- 新增的聯合唯一 alter table 表名 add unique(欄位1);-- 給一個新增唯一 alter table 表名 add unique(欄位2);-- 給另一個新增唯一 //////////////// create table un01( id int,username varchar(20) ); alter table un01 add unique(id,username); insert into un01 values(1,'tom');-- 成功 insert into un01 values(1,'jack');-- 成功 insert into un01 values(1,'tom');-- 失敗 Duplicate entry '1-tom' for key 'id'
非空約束
特點:被修飾過的欄位非空 方式: create table nn( id int not null,username varchar(20) not null ); insert into nn values(null,'tom');-- 錯誤的 Column 'id' cannot be null
案例1 一對多 – 建立使用者表
create table user( id int primary key auto_increment,username varchar(20) ); -- 建立訂單表 create table orders( id int primary key auto_increment,totalprice double,user_id int );
為了保證資料的有效性和完整性,新增約束(外來鍵約束).
在多表的一方新增外來鍵約束
格式:
alter table 多表名稱 add foreign key(外來鍵名稱) references 一表名稱(主鍵);
例如:
alter table orders add foreign key(user_id) references user(id);
添加了外來鍵約束之後有如下特點:
- 1.主表中不能刪除從表中已引用的資料
- 2.從表中不能新增主表中不存在的資料
開發中處理一對多:
在多表中新增一個外來鍵,名稱一般為主表的名稱_id,欄位型別一般和主表的主鍵的型別保持一致,
為了保證資料的有效性和完整性,在多表的外來鍵上新增外來鍵約束即可.
案例2 一對多 – 建立使用者表
-- 建立商品表 create table product( id int primary key auto_increment,name varchar(20),price double ); -- 建立中間表 create table orderitem( oid int,pid int );
– 新增外來鍵約束
alter table orderitem add foreign key(oid) references orders(id);
alter table orderitem add foreign key(pid) references product(id);
開發中處理多對多:
引入一張中間表,存放兩張表的主鍵,一般會將這兩個欄位設定為聯合主鍵,這樣就可以將多對多的關係拆分
成兩個一對多了
為了保證資料的有效性和完整性
需要在中間表上新增兩個外來鍵約束即可.
案例3-多表查詢
笛卡爾積:
多張表無條件的聯合查詢.沒有任何意思 select a.*,b.* from a,b;
內連線
格式1:顯式的內連線 select a.*,b.* from a [inner] join b on ab的連線條件 格式2:隱式的內連線 select a.*,b where ab的連線條件
外連線
左外連線: select a.*,b.* from a left [outer] join b on 連線條件; 意思: 先展示join左邊的(a)表的所有資料,根據條件關聯查詢 join右邊的表(b),符合條件則展示出來,不符合以null值展示. 右外連線: select a.*,b.* from b right [outer] join a on 連線條件; 意思: 先展示jion右邊的表(a)表的所有資料,根據條件關聯查詢join左邊的表(b),不符合以null值展示. 子查詢: 一個查詢依賴另一個查詢.
以上所述是小編給大家介紹的mysql基本操作詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!