一、实验课: (注意:如果用机房的机器,数据库记得带走下次继续用)
- 建立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; 设置列的字符类型