1. 程式人生 > >資料庫實驗1(建立school資料庫)

資料庫實驗1(建立school資料庫)

一、實驗課: (注意:如果用機房的機器,資料庫記得帶走下次繼續用

  1. 建立school資料庫
  2. 在school下建立如下資料庫表,根據表中資料選取合適的資料型別及寬度,設定各表的主鍵及表間外來鍵聯絡:

注意:欄位名是對應漢字欄位名的漢語拼音第一個字母組合而成

  1. 學生表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

 

  1. 院系表D:院系號,名稱,地址,聯絡電話;

表2:D

yxh

mc

dz

lxdh

01

計算機學院

上大東校區三號樓

65347567

02

通訊學院

上大東校區二號樓

65341234

03

材料學院

上大東校區四號樓

65347890

 

  1. 教師表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

 

  1. 課程表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

 

  1. 開課表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

 

  1. 選課表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;   設定列的字元型別