数据库实验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;   设置列的字符类型

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_40774175/article/details/84669126