【0】引言
當下流行的主流關係型資料庫不外乎Oracle、SQL Server、MySQL等,但對它們的數據表操作都離不開SQL語句。
本文就以MySQL為例來呈現下SQL對建表的操作,希望都看到條友有點助益則不甚榮幸。
先看下面一張數據表:
我們看到在這樣一張表應該問的問題有:
這樣的二維表是否可以寫入關係型資料庫?關係型庫的表結構要如何設計?表的每個欄位類型該如何定義?如果後續要增加列,表要做如何調整?哪個列是主鍵呢?【1】如何設計表?
據我個人的經驗與能力所理解,現實中的任何二維表格都是可以轉化為關係型資料庫表的。上面這個表格,單從數據層面講,當然是可以在資料庫中建一個表即可;但如果從也業務層面來講,這需要拆分為三個表:學生表、課程表、成績表。
學生表:姓名、學號、年級、性別、年齡、住址、聯繫電話等;課程表:課程名、課程號;成績表:學號、課程號、學期、考試類型、成績畫出E-R模型:
【2】寫SQL建表語句
首先當然是要分析:
每個欄位該定義何種類型?哪些欄位值的是主鍵?哪些欄位的值需約定範圍?哪些欄位值是唯一的?此處我就通過SQL語句來直接反映分析的結果。
-- 學生表drop table if EXISTS student_info;CREATE TABLE student_info(sname VARCHAR(12) not null, sno VARCHAR(8) PRIMARY KEY UNIQUE not null, grade VARCHAR(8) not null, sex VARCHAR(2) not null, age int not null, address VARCHAR(128), phone NUMERIC(11) ) COMMENT = '學生表' ;-- 課程表drop table if EXISTS course_info;CREATE TABLE course_info( cname VARCHAR(12) UNIQUE not null, cno VARCHAR(8) PRIMARY KEY not null) COMMENT = '課程表' ;-- 成績表drop table if EXISTS score_info;CREATE TABLE score_info( sno VARCHAR(8) PRIMARY KEY not null, cno VARCHAR(8) not null, exam_type VARCHAR(10) not null, score NUMERIC(8,2) not null) COMMENT = '成績表' ;
【3】構建表關聯
通過上面的E-R圖的關係來構建表的關聯。
-- 與學生表關聯 ALTER TABLE score_info ADD FOREIGN KEY student_info_fk_1(sno) REFERENCES student_info(sno); --與課程表關聯 ALTER TABLE score_info ADD FOREIGN KEY student_info_fk_2(cno) REFERENCES course_info(cno);
【4】增加與刪除列
ALTER TABLE score_info add column modify_date TIMESTAMP; -- 增加列 ALTER TABLE student_info drop column phone; -- 刪除列
總結
資料庫的設計思維必須是以業務為導向的,畢竟任何技術都是為了解決現實問才有其意義的;做設計前必須把思路理清楚;熟練掌握SQL語句寫法。