1. 程式人生 > >MySQL 之【約束】【數據庫設計】

MySQL 之【約束】【數據庫設計】

方式 -- 間接 所有 lan incr 主表 三範式 一個

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 之【約束】【數據庫設計】