資料庫實驗1(建立school資料庫)
一、實驗課: (注意:如果用機房的機器,資料庫記得帶走下次繼續用)
- 建立school資料庫
- 在school下建立如下資料庫表,根據表中資料選取合適的資料型別及寬度,設定各表的主鍵及表間外來鍵聯絡:
注意:欄位名是對應漢字欄位名的漢語拼音第一個字母組合而成
- 學生表S:學號,姓名,性別,出生日期,籍貫,手機號碼,院系號;
表1:S
xh |
xm |
xb |
csrq |
jg |
sjhm |
yxh |
1101 |
李明 |
男 |
1993-03-06 |
上海 |
13613005486 |
02 |
1102 |
劉曉明 |
男 |
1992-12-08 |
安徽 |
18913457890 |
01 |
1103 |
張穎 |
女 |
1993-01-05 |
江蘇 |
18826490423 |
01 |
1104 |
劉晶晶 |
女 |
1994-11-06 |
上海 |
13331934111 |
01 |
1105 |
劉成剛 |
男 |
1991-06-07 |
上海 |
18015872567 |
01 |
1106 |
李二麗 |
女 |
1993-05-04 |
江蘇 |
18107620945 |
01 |
1107 |
張曉峰 |
男 |
1992-08-16 |
浙江 |
13912341078 |
01 |
- 院系表D:院系號,名稱,地址,聯絡電話;
表2:D
yxh |
mc |
dz |
lxdh |
01 |
計算機學院 |
上大東校區三號樓 |
65347567 |
02 |
通訊學院 |
上大東校區二號樓 |
65341234 |
03 |
材料學院 |
上大東校區四號樓 |
65347890 |
- 教師表T:工號,姓名,性別,出生日期,學歷,基本工資,院系編號;
表3:T
gh |
xm |
xb |
csrq |
xl |
jbgz |
yxh |
0101 |
陳迪茂 |
男 |
1973-03-06 |
副教授 |
3567.00 |
01 |
0102 |
馬小紅 |
女 |
1972-12-08 |
講師 |
2845.00 |
01 |
0201 |
張心穎 |
女 |
1960-01-05 |
教授 |
4200.00 |
02 |
0103 |
吳寶鋼 |
男 |
1980-11-06 |
講師 |
2554.00 |
01 |
- 課程表C:課號,課名,學分,學時,院系號;(預設學分4,學時40)
表4:C
kh |
km |
xf |
xs |
08305001 |
離散數學 |
4 |
40 |
08305002 |
資料庫原理 |
4 |
50 |
08305003 |
資料結構 |
4 |
50 |
08305004 |
系統結構 |
6 |
60 |
08301001 |
分子物理學 |
4 |
40 |
08302001 |
通訊學 |
3 |
30 |
- 開課表O:學期,課號,工號,上課時間;
表5:O
xq |
kh |
gh |
sksj |
2012-2013秋季 |
08305001 |
0103 |
星期三5-8 |
2012-2013冬季 |
08305002 |
0101 |
星期三1-4 |
2012-2013冬季 |
08305002 |
0102 |
星期三1-4 |
2012-2013冬季 |
08305002 |
0103 |
星期三1-4 |
2012-2013冬季 |
08305003 |
0102 |
星期五5-8 |
2013-2014秋季 |
08305004 |
0101 |
星期二1-4 |
2013-2014秋季 |
08305001 |
0102 |
星期一5-8 |
2013-2014冬季 |
08302001 |
0201 |
星期一5-8 |
- 選課表E:學號,學期,課號,工號,平時成績,考試成績,總評成績;(成績範圍1-100)
表6:E
xh |
xq |
kh |
gh |
pscj |
kscj |
zpcj |
1101 |
2012-2013秋季 |
08305001 |
0103 |
60 |
60 |
60 |
1102 |
2012-2013秋季 |
08305001 |
0103 |
87 |
87 |
87 |
1102 |
2012-2013冬季 |
08305002 |
0101 |
82 |
82 |
82 |
1102 |
2013-2014秋季 |
08305004 |
0101 |
0 |
0 |
0 |
1103 |
2012-2013秋季 |
08305001 |
0103 |
56 |
56 |
56 |
1103 |
2012-2013冬季 |
08305002 |
0102 |
75 |
75 |
75 |
1103 |
2012-2013冬季 |
08305003 |
0102 |
84 |
84 |
84 |
1103 |
2013-2014秋季 |
08305001 |
0102 |
0 |
0 |
0 |
1103 |
2013-2014秋季 |
08305004 |
0101 |
0 |
0 |
0 |
1104 |
2012-2013秋季 |
08305001 |
0103 |
74 |
74 |
74 |
1104 |
2013-2014冬季 |
08302001 |
0201 |
0 |
0 |
0 |
1106 |
2012-2013秋季 |
08305001 |
0103 |
85 |
85 |
85 |
1106 |
2012-2013冬季 |
08305002 |
0103 |
66 |
66 |
66 |
1107 |
2012-2013秋季 |
08305001 |
0103 |
90 |
90 |
90 |
1107 |
2012-2013冬季 |
08305003 |
0102 |
79 |
79 |
79 |
1107 |
2013-2014秋季 |
08305004 |
0101 |
0 |
0 |
0 |
解決方案:
1. 先做出資料庫設計書,寫好設計書以後再根據其寫出程式碼
設計書如下:
程式碼:
#學院表
create table department(
dnum varchar(20) not null,
dname varchar(20) not null,
address varchar(20) not null,
dphone varchar(20) not null,
primary key(dnum)
);
# 學生表
create table student(
studentNum varchar(20) not null,
sname varchar(20) not null,
ssex varchar(20) not null,
birthday date not null,
loaction varchar(20) not null,
sphone varchar(20) not null,
dnum varchar(20) not null,
foreign key(dnum) references department(dnum),
primary key(studentNum)
);
//教師表
create table teacher(
workNum varchar(20) not null,
tname varchar(20) not null,
tsex varchar(20) not null,
tdate date not null,
level varchar(20) not null,
salay double not null,
dnum varchar(20) not null,
foreign key(dnum) references department(dnum),
primary key(workNum)
);
//課程表
create table course(
courseNum varchar(20) not null,
cname varchar(20) not null,
credit int not null,
period int not null,
dnum varchar(20) not null,
foreign key(dnum) references department(dnum),
primary key(courseNum)
);
//開課表
create table opencourse(
term varchar(20) not null,
courseNum varchar(20) not null,
workNum varchar(20) not null,
classTime varchar(20) not null,
foreign key(courseNum) references course(courseNum),
foreign key(workNum) references teacher(workNum),
primary key(term,courseNum,workNum)
);
//選課表
create table selectcourse(
studentNum varchar(20) not null,
courseNum varchar(20) not null,
workNum varchar(20) not null,
term varchar(20) not null,
freeGrade int ,
examGrade int,
finalGrade int,
foreign key(courseNum) references course(courseNum),
foreign key(workNum) references teacher(workNum),
foreign key(studentNum) references student(studentNum),
foreign key(term) references opencourse(term),
primary key(term,courseNum,workNum,studentNum)
);
插入資料可以直接使用java寫個程式進行讀入:
程式碼:
package shop.db;
import java.util.*;
import java.sql.*;
import java.io.*;
public class connectDb {
static Connection conn=null;
static PreparedStatement pstmt = null;
static ResultSet rs = null;
public static void main(String [] args)
{
// conn = getConn();
// try
// {
// ArrayList<String> list=readFile();
// String sql = "insert into department(dnum,dname,address,dphone) values(?,?,?,?)";
// for(int i=0;i<list.size();i++)
// {
// pstmt = conn.prepareStatement(sql);
// String str=list.get(i);
// String [] arr = str.split("\\s+");
// int k=1;
// for(String ss:arr)
// {
// System.out.println(ss);
// pstmt.setString(k, ss);
// k++;
// }
// System.out.println("out");
// pstmt.executeUpdate();
// }
// }
// catch(SQLException e)
// {
// e.printStackTrace();
// }
// finally {
// closeDb.addClose(pstmt, conn);
// }
conn = getConn();
try
{
ArrayList<String> list=readFile();
String sql = "insert into selectcourse(studentNum,term,courseNum,workNum,freeGrade,examGrade,finalGrade) values(?,?,?,?,?,?,?)";
for(int i=0;i<list.size();i++)
{
pstmt = conn.prepareStatement(sql);
String str=list.get(i);
String [] arr = str.split("\\s+");
int k=1;
for(String ss:arr)
{
if(k==5||k==6||k==7)
{
int tmp = Integer.parseInt( ss);
pstmt.setInt(k, tmp);
}
else{
pstmt.setString(k, ss);
}
k++;
//if(k==7) break;
}
pstmt.executeUpdate();
}
}
catch(SQLException e)
{
e.printStackTrace();
}
finally {
closeDb.addClose(pstmt, conn);
}
}
public static ArrayList<String> readFile() {
ArrayList<String> line=new ArrayList<String>();
String pathname = "C:\\Users\\Administrator\\Desktop\\student.txt"; // 絕對路徑或相對路徑都可以,寫入檔案時演示相對路徑,讀取以上路徑的input.txt檔案
//防止檔案建立或讀取失敗,用catch捕捉錯誤並列印,也可以throw;
//不關閉檔案會導致資源的洩露,讀寫檔案都同理
//Java7的try-with-resources可以優雅關閉檔案,異常時自動關閉檔案;詳細解讀https://stackoverflow.com/a/12665271
try (FileReader reader = new FileReader(pathname);
BufferedReader br = new BufferedReader(reader) // 建立一個物件,它把檔案內容轉成計算機能讀懂的語言
) {
String tmp;
//網友推薦更加簡潔的寫法
while ((tmp = br.readLine()) != null)
{
// 一次讀入一行資料
//System.out.println(tmp);
line.add(tmp);
}
} catch (IOException e) {
e.printStackTrace();
}
return line;
}
public static Connection getConn()
{
try
{
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("成功載入mysql");
}
catch(ClassNotFoundException e)
{
System.out.println("沒有找到mysql驅動");
e.printStackTrace();
}
String url ="jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false";
Connection conn=null;
try
{
conn = DriverManager.getConnection(url, "root", "密碼");
/*System.out.println("連線db");
Statement cur = (Statement)conn.createStatement();
System.out.println("成功連線資料庫");
ResultSet rs= cur.executeQuery("select * from goods");
System.out.println(rs.toString());
while(rs.next())
{
System.out.println(rs.getString("title"));
}
cur.close();
conn.close();*/
}
catch(SQLException e) {
System.out.println("連線失敗");
e.printStackTrace();
}
return conn;
}
}
易錯點: 外來鍵,字元型別(中文必須用utf8)
需要設定資料庫為utf8,表為utf8,列也要為utf8.
alter table opencourse change term term varchar(20) character set utf8; 設定列的字元型別