資料庫約束與多表查詢

2021-10-04 21:44:46 字數 3470 閱讀 4879

小案例:假設乙個網購平台買賣商品,那麼他的資料庫中一定會有商品表,使用者表還有訂單表。在這三個表中沒有存在約束的話,那麼這三個表可以被單獨任意更改,我可以隨意的刪除使用者,但是被刪除的使用者訂單資訊還是存在於訂單表中,那麼此時資料庫中的資料就變得毫無意義,這也就體現了資料庫表之間的約束的重要性。

資料庫表之間的約束的作用:為了保證資料的有效性和完整性

以mysql為例:mysql中常見的約束:

主鍵約束(primary key)

自增長約束(auto_incrment)

唯一約束(unique)

非空約束(not null)

外來鍵約束(foreign key)

非負約束(unsigned)

主鍵約束

主鍵約束:被修飾的主鍵字段唯一且非空

一張表只能有乙個主鍵,但是可以用多個字段構成乙個主鍵。(多個字段組合體就具備唯一且非空)

建立:1.建表的同時新增約束 格式:欄位名稱 字段型別 primary key

2.建表的同時在約束區域新增約束 當所有字段宣告完後就是約束區域

格式:create table user(

user_id int,

user_name varchar(10),

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);

刪除主鍵約束

1.該錶的主鍵字段只有主鍵約束

(1). alter table 表名 drop primary key; – 這樣只刪除了唯一約束,該欄位還有非空約束

(2). alter table [表名] modify [列名] [資料型別] null; --修改欄位名還為原來的字段 加上null即可

2.該錶的主鍵欄位還具有自增長約束

只需要在前面的步驟增加刪除自增長約束即可,其實就是修改自增長欄位名和資料型別還為原來的欄位名和型別

alter table 表名 change 欄位名 欄位名 資料型別; --刪除自增長約束

唯一約束

唯一約束修飾的字段對null沒有作用,也就是說該欄位雖然具有唯一約束,但是也可以出現多個null值

建立:1.建表的同時新增約束 格式: 欄位名稱 字段型別unique

create table un(

id int unique,

username varchar(20) unique

);

2.建表的同時在約束區域新增約束

3.alter table 表名 add unique(欄位1,欄位2);-- 新增的聯合唯一

alter table 表名 add unique(欄位1);-- 給乙個新增唯一

非空約束

非空約束修飾的字段非空

建立方式:create table nn(

id int not null,

username varchar(20) not null

);

清空表truncate 格式:

truncate 表名;刪除表,重新建立一張空表

與delete from 有所區別:delete屬於dml語句,truncate屬於ddl語句,delete是逐條刪除

er圖我們在建立表之前,需要用er圖來展示出表之間的關係,以幫助我們更清晰的建立表之間的約束。

er圖中有如下成分:

矩形框:表示實體

菱形框:表示聯絡

橢圓形框:表示實體或聯絡的屬性

連線:實體與屬性之間,實體與聯絡之間用直線相連,要在實體連線方向表明是聯絡的形式(一對一,一對多,多對多)

一對多聯絡

開發中,關係中的一方稱之為主表或者一表,關係中的多方稱之為多表或者從表,為了表示一對多的關係,一般會在多表的一方新增乙個字段,欄位的型別一般和主表的主鍵型別保持一致,該字段就為外來鍵。

使用者和訂單

– 建立使用者表

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 一表名稱(主鍵);

eg:alter table orders add foreign key(user_id) references user(id);

新增外來鍵約束後特點:

主表中不能刪除從表中引用的資料

從表中不能新增主表中不存在的資料

新增外來鍵後的資料刪除:

1.級聯刪除:alter table orders add foreign key(user_id) references users(id) on delete cascade;

2.先刪除帶有外來鍵的多表的資料,然後再刪除主表中的資料

對於多對多的表之間的關係處理

引入一張中間表,存放兩張表的主鍵,然後將這兩個字段設定為聯合主鍵,在中間表中新增兩個外來鍵約束,就可拆分為兩個一對多的關係

多表查詢

內連線1.顯示的內連線

select a.,b. from a [inner] join b on ab的連線條件

2.隱示的內連線

select a.,b. from a,b where ab的連線條件

外連線左外連線:

select a.,b. from a left [outer] join b on 連線條件;outer 可以不寫

意思:先展示join左邊的(a)表的所有資料,根據條件關聯查詢 join右邊的表(b),符合條件則展示出來,不符合以null值展示.

右外連線:

select a.,b. from b right [outer] join a on 連線條件;outer 可以不寫

意思:先展示jion右邊的表(a)表的所有資料,根據條件關聯查詢join左邊的表(b),符合條件則展示出來,不符合以null值展示.

子查詢:乙個查詢依賴另乙個查詢

多表查詢資料庫

在專案中建立資料庫的時候,我們經常會進行多表查詢。資料庫中建立乙個表應該與乙個實體類相對應。乙個實體物件應該與一條記錄相對應。資料庫是一種結構化的查詢語言,資料庫語言是非過程化的,寫一句就可以執行一句。進行建表的時候,如果是一對多的關係,應該在多的一方建立乙個字段。該字段為少的一方的id。進行建表的...

資料庫多表查詢

笛卡爾積 select from emp,dept select from emp cross join dept 內連線 inner join 內連線把兩個表連線成乙個表 稱為第三個表 在這個表中僅包含那些滿足連線條件的記錄行 select from emp,dept where emp.dept...

mySQL資料庫之子查詢與多表查詢

user info表 create table user info id int 2 primary key,user name varchar 12 unique password varchar 15 not null real name varchar 8 not null age int 3...