1. 程式人生 > 資料庫 >詳解mysql基本操作詳細(二)

詳解mysql基本操作詳細(二)

前言

本文類容

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. 1.主表中不能刪除從表中已引用的資料
  2. 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基本操作詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!