数据库课程设计说明书.docx
《数据库课程设计说明书.docx》由会员分享,可在线阅读,更多相关《数据库课程设计说明书.docx(11页珍藏版)》请在冰点文库上搜索。
数据库课程设计说明书
课程设计说明书
设计题目:
选择一种高级语言实现一个简单的DBMS_
专业:
计算机科学与技术班级:
10级2班_
设计人:
_
山东科技大学
2012年6月27日
课程设计任务书
学院信息科学与工程学院专业XXX班级XX级2班姓名XXX
一、课程设计题目:
(1)实现创建表和修改表
(2)插入和更新表的记录
二、课程设计主要参考资料:
(1)《数据库系统概论》(第四版)高等教育出版社
三、课程设计应解决的主要问题:
(1)实现:
CREATETABLE<表名>(<列名><数据类型>[<列完整性约束条件>][,<列名><数据类型>[<列完整性约束条件>]…][,<表完整性约束条件>])
(2)实现:
ALTERTABLE<表名>[ADD<新列名><数据类型>[<列完整性约束>]][DROP<列完整性约束名>][MODIFY<列名><数据类型>]
四、课程设计相关附件(如:
图纸、软件等):
(1)Code:
:
blocks10.05
五、任务发出日期:
2012/5/1课程设计完成日期:
2012/6/27
指导教师签字:
系主任签字:
指导教师对课程设计的评语
指导教师签字:
2011年月日
一、设计要求:
(1)设计实现表的物理存储结构;
(2)语句以命令行和图形化界面两种形式实现;
(3)有两个以上关系模式,关系模式要满足实体完整性和参照完整性。
二、需求分析:
(1)通过输入SQL语言,建立一个表。
包括表名、列名、数据类型、列完整性约束条件。
(2)通过输入SQL语言,对建好的表进行修改。
包括增加表的列完整性约束条件、删除表的列完整约束条件、增加列名、删除列名等。
(3)输入SQL语言,对建好的表进行插入数据,并能进行对相关数据的修改,包括增加数据,删除数据等功能。
三、设计思想:
(1)利用两个结构体,一个用来存放解析出来的约束条件,另一个用来存放属性和元组。
设计多个标记来记录不同的约束条件。
例如,用cnt1来记录属性的约束条件,如果cnt1=1,那么约束条件为PARIMARYKEY,如果cnt1=2,那么约束条件为UNIQUE,如果cnt1=3,那么约束条件为CHECK,如果cnt1=4,那么约束条件为NOTNULL。
(2)解析语句的时候,利用Ignore_Space()来忽略空格与回车,利用Is_Number()来读取数字,利用To_Lower()来转换为小写,利用Get_Word()来获取单词,利用Cmp_Word()对读取的单词与传入的单词做比较。
在通过Judge_Condition()、Judge_Type()、Judge_Between()、Judge_In()、Judge_Operator()等对约束条件中的数据类型、CHECK语句的关键词、字符进行判断。
(3)通过解析语句,区分出创建表CREATETABLE、修改表AlterTable、插入数据Insert、修改数据UPDATE.并分别调用各自的函数,进行相应的操作。
在创建表的过程中,要把表名、属性名、完整性约束等信息进行提取,存放在结构体中,在修改表的过程中,为了操作方便,直接在表的最后进行操作。
例如,添加新的属性列,直接在表的最后进行添加,删除一个属性里,直接用最后一个属性列去覆盖想要删除的属性列。
(4)程序中还包括了判错的过程,若输入有错,或者是进行的操作有错,都会有错误提示,并在相应的位置进行修改。
四、程序流程图:
五、主要源程序:
(1)创建表:
intCreate_Talbe(char*s,Table&t,char*result)
{
int&idx=t.proverty_num;
inttemp,len,i=0;
charword[20];
//提取create
if(Cmp_Word(i,s,"create")==0){strcpy(result,"errornearcreate");return0;}
//提取table
if(Cmp_Word(i,s,"table")==0){strcpy(result,"errorneartable");return0;}
Ignore_Space(i,s);Get_Word(i,s,word);
strcpy(t.table_name,word);
Ignore_Space(i,s);
if(s[i]!
='('){
strcpy(result,"errorneartable(");
return0;
}else++i;
while
(1){
//提取属性名
Ignore_Space(i,s);Get_Word(i,s,word);
len=strlen(word);
if(len==0){
strcpy(result,"error属性名为空");
return0;
}
int&idx=t.proverty_num;
strcpy(t.proverty_name[idx],word);
//属性类型intchardouble
Ignore_Space(i,s);
Get_Word(i,s,word);
To_Lower(word);
temp=Judge_Type(word);
if(temp>=Type_Num){strcpy(result,"errortype");return0;}
t.condition[idx].type=temp;
//当为字符串类型时处理字符串的约束长度char(20)
if(temp==Judge_Type("char")){
Ignore_Space(i,s);
if(s[i++]!
='('){strcpy(result,"errornearchar(");return0;}
Ignore_Space(i,s);Get_Word(i,s,word);
intflage=Is_Number(word);
if(flage==0){strcpy(result,"errorinchar()");return0;}
sscanf(word,"%d",&temp);
t.condition[idx].Len_constraint=temp;
Ignore_Space(i,s);
if(s[i++]!
=')'){strcpy(result,"errornearchar)");return0;}
}
//约束条件如果有的话primaryuniquechecknotnull
Ignore_Space(i,s);Get_Word(i,s,word);To_Lower(word);
temp=Judge_Condition(word);
switch(temp){
case0:
//当为primary时
Ignore_Space(i,s);Get_Word(i,s,word);To_Lower(word);
if(strcmp(word,"key")!
=0){strcpy(result,"errornearprimary");return0;}
t.condition[idx].con1=1;
break;
case1:
//当为unique时
t.condition[idx].con1=2;
break;
case2:
//当为check时
if(s[i++]!
='('){strcpy(result,"errornearcheck(");return0;}
Ignore_Space(i,s);Get_Word(i,s,word);
if(strcmp(word,t.proverty_name[idx])!
=0){strcpy(result,"errornearcheck属性名");return0;}
//判between>=<=<>=IN….
Ignore_Space(i,s);Get_Word(i,s,word);To_Lower(word);
//between
if(strcmp(word,"between")==0){
intl,r;
if(Judge_Between(l,r,i,s)==0){strcpy(result,"errorincheckbetween");return0;}
t.condition[idx].con2=8;
t.condition[idx].bl=l,t.condition[idx].br=r;
}elseif(strcmp(word,"in")==0){//in
t.condition[idx].con2=7;
if(Judge_In(t.condition[idx].type,t.condition[idx].cnt,t.condition[idx].conin,i,s)==0){strcpy(result,"errorincheckin");return0;}
}elseif(Judge_Operator(t.condition[idx].con2,t.condition[idx].bound,i,s)==0)
{strcpy(result,"errorincheckoperator");return0;
}
Ignore_Space(i,s);
if(s[i++]!
=')'){strcpy(result,"errornearcheck)");return0;}
break;
case3:
//not
Ignore_Space(i,s);Get_Word(i,s,word);To_Lower(word);
if(strcmp(word,"null")!
=0){strcpy(result,"errornearnot");return0;}
t.condition[idx].con1=4;
break;
case4:
strcpy(result,"errornear约束条件");
return0;
break;
case5:
break;
}
Ignore_Space(i,s);
if(s[i]==','){i++;idx++;continue;}//,代表当前的属性读取完毕
elseif(s[i]==')'){//Judge是否为最后一条属性读入语句结束
i++;
Ignore_Space(i,s);
if(s[i]==';'){
idx++;
strcpy(result,"createsucess");
return1;
}else{
strcpy(result,"errorafterchar");
return0;
}
}else{
strcpy(result,"errornear,");
return0;
}
}
}
六、运行结果:
(1)创建表:
(2)修改表:
(3)插入数据:
(4)修改数据:
(5)创建第二张表,并进行相关操作:
(6)创建第三表,并进行相关操作:
(7)创建的三张表的最终结果:
七、参考资料:
(1)数据库系统概论(第四版)高等教育出版社
(2)SQL语言入门
八、总结:
(1)由于使用语言的限制,造成只能实现用命令行,而没有实现图形化界面的形式进行展示。
(2)在代码中实现了对主码、外码、列完整性约束条件、表完整约束条件的读取与存储,并且可是实现建立多个表的功能。
但是,在有两个以上的关系模式时,关系模式无法满足实体完整性和参照完整性。