MySQL 之【約束】【數據庫設計】
1.MySQL 約束:
1.約束的概念:
約束是一種限制,它通過對表的行或列的數據做出限制,來確保表的數據的完整性、唯一性。
MySQL中,常用的幾種約束:
約束類型: 非空 主鍵 唯一 外鍵 默認值 關鍵字: NOT NULL
PRIMARY KEY UNIQUE FOREIGN KEY DEFAULT 1.非空約束(NOT NULL),聽名字就能理解,被非空約束的列,在插入值時必須非空。
create table t1( id int(10) not null primary key );2.主鍵(PRIMARY KEY)是用於約束表中的一行,作為這一行的標識符,在一張表中通過主鍵就能準確定位到一行,因此主鍵十分重要。
註意: 主鍵這一行的數據不能重復且不能為空。
create table t2( id int(10) not null primary key );還有一種特殊的主鍵——復合主鍵。主鍵不僅可以是表中的一列,也可以由表中的兩列或多列來共同標識
create table t3( id int(10) not null, name varchar(255) , primary key(id,name) );//alter刪除主鍵約束
alter table t3 drop primary key;
//alter添加主鍵約束
alter table t3 add primary key(name, pwd);
//alter 修改列為主鍵
alter table t3 modify id int primary key;
3.唯一約束(UNIQUE)比較簡單,它規定一張表中指定的一列的值必須不能有重復值,即這一列每個值都是唯一的。
當INSERT語句新插入的數據和已有數據重復的時候,如果有UNIQUE約束,則INSERT失敗.
create table t4( id int(10) not null, name varchar(255) , unique id_name(id,name) ); //添加唯一約束 alter table t4 add unique id_name(id,name); //刪除唯一約束 alter table t4 drop index id_name;4,外鍵(FOREIGN KEY)既能確保數據完整性,也能表現表之間的關系。
註意: 一個表可以有多個外鍵,每個外鍵必須REFERENCES(參考)另一個表的主鍵,被外鍵約束的列,取值必須在它參考的列中有對應值。
-- 部門表 create table dept( dept_id int(30) not null auto_increment primary key, dept_name varchar(255) not null ); -- 員工表 create table emp( id int(10) not null auto_increment primary key, name varchar(50) not null, dept_id int(10) not null, constraint f_key foreign key (dept_id) references dept(dept_id) on delete cascade );註意:添加外鍵約束後,部門表中的數據如果被員工表中的數據使用了,則不可以刪除.默認情況下.
註意:員工表中的外鍵字段只能添加部門表中存在的數據.
級聯刪除:刪除主表的數據時,關聯的從表數據也刪除,
則需要在建立外鍵約束的後面增加on delete cascade或on delete set null, 前者是級聯刪除,
後者是將從表的關聯列的值設置為null
警告:進公司工作時,最好問清楚,表的主外建設計是否需要添加約束?
5.默認值約束(DEFAULT)規定,當有DEFAULT約束的列,插入數據為空時該怎麽辦。
DEFAULT約束只會在使用INSERT語句時體現出來,INSERT語句中,如果被DEFAULT約束的位置沒有值,那麽這個位置將會被DEFAULT的值填充
create table t5( id int(10) not null primary key, name varchar(255) default ‘張三‘ );
2.數據庫設計
1.概念
簡單來說,數據庫設計就是對需求進行分析、邏輯設計、物理設計以及維護和優化的過程。可以看到,數據庫設計不僅僅體現在軟件開發過程中,還體現在軟件後期的維護上。(時間周期)
這裏的軟件需求分析與軟件開發過程中的需求分析不太一樣,數據庫設計中的需求分析更側重數據源(什麽數據)、數據的屬性以及數據和屬性的特點。總結:
1.有效存儲數據.
2.滿足用戶的多種需求
2.規則:
數據庫設計三範式:
1.第一範式:確保每列保持原子性
2.第二範式:確保表中的每列都和主鍵相關
3.第三範式:確保表中每一列都和主鍵列直接相關,而不是間接相關.詳情參考:數據庫三範式-詳解
3.數據庫表關系
表與表之間一般存在三種關系,即一對一,一對多,多對多關系。
下面分別就三種關系講解數據庫相關設計的思路和思考過程;1.一對一關系
CREATE TABLE IF NOT EXISTS person( id INT PRIMARY KEY AUTO_INCREMENT, sname VARCHAR(10), sex CHAR(1), husband INT, wife INT ); INSERT INTO person VALUES(1,‘小花‘,‘0‘,3,0); INSERT INTO person VALUES(2,‘小明‘,‘1‘,0,4); INSERT INTO person VALUES(3,‘張三‘,‘1‘,0,1); INSERT INTO person VALUES(4,‘小麗‘,‘0‘,2,0); INSERT INTO person VALUES(5,‘王五‘,‘1‘,0,0);sql代碼對應的person表:
從表中可以看出,小花和張三是夫妻,小明和小麗是夫妻。
通常為了查詢方便,需要兩個表,但實際項目中為了省空間,通常只建一個表.
2、一對多關系
例如:一個人可以擁有多輛汽車,要求查詢某個人擁有的所有車輛。
分析:這種情況其實也可以采用 一張表,但因為一個人可以擁有多輛汽車,如果采用一張表,會造成冗余信息過多。好的設計方式是,人和車輛分別單獨建表,那麽如何將兩個表關聯呢?有個巧妙的方法,在車輛的表中加個外鍵字段(人的編號)即可。
* (思路小結:’建兩個表,一’方不動,’多’方添加一個外鍵字段)*//建立人員表 CREATE TABLE people( id VARCHAR(12) PRIMARY KEY, sname VARCHAR(12), age INT, sex CHAR(1) ); INSERT INTO people VALUES(‘H001‘,‘小王‘,27,‘1‘); INSERT INTO people VALUES(‘H002‘,‘小明‘,24,‘1‘); INSERT INTO people VALUES(‘H003‘,‘張慧‘,28,‘0‘); INSERT INTO people VALUES(‘H004‘,‘李小燕‘,35,‘0‘); INSERT INTO people VALUES(‘H005‘,‘王大拿‘,29,‘1‘); INSERT INTO people VALUES(‘H006‘,‘周強‘,36,‘1‘); //建立車輛信息表 CREATE TABLE car( id VARCHAR(12) PRIMARY KEY, mark VARCHAR(24), price NUMERIC(6,2), hid VARCHAR(12), CONSTRAINT fk_people FOREIGN KEY(hid) REFERENCES human(id) ); INSERT INTO car VALUES(‘C001‘,‘BMW‘,65.99,‘H001‘); INSERT INTO car VALUES(‘C002‘,‘BenZ‘,75.99,‘H002‘); INSERT INTO car VALUES(‘C003‘,‘Skoda‘,23.99,‘H001‘); INSERT INTO car VALUES(‘C004‘,‘Peugeot‘,20.99,‘H003‘); INSERT INTO car VALUES(‘C005‘,‘Porsche‘,295.99,‘H004‘); INSERT INTO car VALUES(‘C006‘,‘Honda‘,24.99,‘H005‘); INSERT INTO car VALUES(‘C007‘,‘Toyota‘,27.99,‘H006‘); INSERT INTO car VALUES(‘C008‘,‘Kia‘,18.99,‘H002‘); INSERT INTO car VALUES(‘C009‘,‘Bentley‘,309.99,‘H005‘);sql代碼對應的人員表:
sql代碼對應的車輛信息表:
3.多對多關系
例如:學生選課,一個學生可以選修多門課程,每門課程可供多個學生選擇。
分析:這種方式可以按照類似一對多方式建表,但冗余信息太多,好的方式是實體和關系分離並單獨建表,實體表為學生表和課程表,關系表為選修表,其中關系表采用聯合主鍵的方式(由學生表主鍵和課程表主鍵組成)建表。//建立學生表 CREATE TABLE student( id VARCHAR(10) PRIMARY KEY, sname VARCHAR(12), age INT, sex CHAR(1), class VARCHAR(6) ); INSERT INTO student VALUES(‘p0001‘,‘王軍‘,20,1,‘c101‘); INSERT INTO student VALUES(‘p0002‘,‘張宇‘,21,1,‘c101‘); INSERT INTO student VALUES(‘p0003‘,‘劉飛‘,22,1,‘c102‘); INSERT INTO student VALUES(‘p0004‘,‘趙燕‘,18,0,‘c103‘); INSERT INTO student VALUES(‘p0005‘,‘曾婷‘,19,0,‘c103‘); INSERT INTO student VALUES(‘p0006‘,‘周慧‘,21,0,‘c104‘); INSERT INTO student VALUES(‘p0007‘,‘小紅‘,23,0,‘c104‘); INSERT INTO student VALUES(‘p0008‘,‘楊曉‘,18,0,‘c104‘); INSERT INTO student VALUES(‘p0009‘,‘李傑‘,20,1,‘c105‘); INSERT INTO student VALUES(‘p0010‘,‘張良‘,22,1,‘c105‘); //建立課程表 CREATE TABLE course( id VARCHAR(10) PRIMARY KEY, sname VARCHAR(12), credit NUMERIC(2,1), teacher VARCHAR(12) ); INSERT INTO course VALUES(‘C001‘,‘Java‘,3.5,‘李老師‘); INSERT INTO course VALUES(‘C002‘,‘高等數學‘,5.0,‘趙老師‘); INSERT INTO course VALUES(‘C003‘,‘JavaScript‘,3.5,‘王老師‘); INSERT INTO course VALUES(‘C004‘,‘離散數學‘,3.5,‘蔔老師‘); INSERT INTO course VALUES(‘C005‘,‘數據庫‘,3.5,‘廖老師‘); INSERT INTO course VALUES(‘C006‘,‘操作系統‘,3.5,‘張老師‘); //建立選修表 CREATE TABLE sc( sid VARCHAR(10), cid VARCHAR(10) ); ALTER TABLE sc ADD CONSTRAINT pk_sc PRIMARY KEY(sid,cid); ALTER TABLE sc ADD CONSTRAINT fk_student FOREIGN KEY(sid) REFERENCES student(id); ALTER TABLE sc ADD CONSTRAINT fk_course FOREIGN KEY(cid) REFERENCES course(id); INSERT INTO sc VALUES(‘S0001‘,‘C001‘); INSERT INTO sc VALUES(‘S0001‘,‘C002‘); INSERT INTO sc VALUES(‘S0001‘,‘C003‘); INSERT INTO sc VALUES(‘S0002‘,‘C001‘); INSERT INTO sc VALUES(‘S0002‘,‘C004‘); INSERT INTO sc VALUES(‘S0003‘,‘C002‘); INSERT INTO sc VALUES(‘S0003‘,‘C005‘); INSERT INTO sc VALUES(‘S0004‘,‘C003‘); INSERT INTO sc VALUES(‘S0005‘,‘C001‘); INSERT INTO sc VALUES(‘S0006‘,‘C004‘); INSERT INTO sc VALUES(‘S0007‘,‘C002‘); INSERT INTO sc VALUES(‘S0008‘,‘C003‘); INSERT INTO sc VALUES(‘S0009‘,‘C001‘); INSERT INTO sc VALUES(‘S0009‘,‘C005‘);sql代碼對應的學生表:
sql代碼對應的課程表:
sql代碼對應的選課表:
MySQL 之【約束】【數據庫設計】