在做学生信息管理系统的时候遇到了,这样一个问题:不同年级不能添加相同班号,举个具体例子描述—有一、二、三个年级,当一年级添加了1班,2年级就不允许添加一班。其代码为:
Dim mrc As ADODB.Recordset '用来存放记录集信息
Dim MsgText As String '用来返回记录集信息
Dim txtSQL As String '用来存放SQL语句的
txtSQL = "select * fromclass_info" 'sql 语句查找班级信息
Set mrc = ExecuteSQL(txtSQL, MsgText) '找出符合条件的表,并显示出来
If Not (mrc.EOF And mrc.BOF) Then '判断是否为最后一条记录或是第一条记录
mrc.MoveFirst
End If
While (mrc.EOF = False) '当数据库未到最后一条语句时,判断班号是否重复
If(Trim(mrc.Fields(0)) = Trim(cboClassno.Text)) Then
MsgBox "班号存在,请重新输入班号!",vbOKOnly + vbExclamation, "警告"
cboClassno.Text = ""
cboClassno.SetFocus
Exit Sub
Else
mrc.MoveNext '移动到下一条记录
End If
Wend
mrc.AddNew '把当前的内容如添加到数据库中
mrc.Fields(0) =Trim(cboClassno.Text)
mrc.Fields(1) =Trim(cboGrade.Text)
mrc.Fields(2) =Trim(txtDirector.Text)
mrc.Fields(3) =Trim(txtClassroom.Text)
mrc.Update '更新数据库
mrc.Close '关闭数据库
MsgBox "添加班级信息成功!",vbOKOnly + vbExclamation, "添加班级信息"
怎么才可以完善这个过程,符合实际情况,使不同的年级可以添加相同的班级,但不允许在一个年级里出现相同的班级。
我当时想创建两张表,一张表是年级,一张表是班级,通过主键和外键的关系将其关联起来。但是被师哥否决,其意为年级和班级共同确定一个班级,为什么会是两张表呢。从这里引发,什么情况下才用到主键和外键彼此之间有关联。外键是设置当前表中的某一列与别一数据表中的主键列关联。主要目的是控制与外键表中的数据,保持数据一致性,完整性,也就是说:当前表中这一列的数据必须是关联外键列中的某一数据,而且相关联的两个数据列的类型必须相同;当关联外键列某一数据修改或删除时,将触当前表的某一项相应操作。简洁的说主键和外键的使用就是保持数据的一致性、完整性。
后来经过我的反复思考,我终于想明白了,设置主键可以分为两种情况:1、可以单字段组成;2、可以多字段组合为主键。我就是没有想到第二种情况,其实可以把年级和班级设置为一个主键即可,解决上述问题。修改的代码如下:
Dim mrc As ADODB.Recordset '用来存放记录集信息
Dim MsgText As String '用来返回记录集信息
Dim txtSQL As String '用来存放SQL语句的
txtSQL = "select *fromclass_Info where grade='" & cboGrade.Text & "' and class_No='" & cboClassno.Text &"'"
Set mrc = ExecuteSQL(txtSQL, MsgText)
If mrc.EOF = False Then
MsgBox "已经有对应年级的班级记录,请重新输入信息!", vbOKOnly + vbExclamation,"警告"
mrc.Close
Else
mrc.AddNew '把当前的内容如添加到数据库中
mrc.Fields(0) = Trim(cboClassno.Text)
mrc.Fields(1) = Trim(cboGrade.Text)
mrc.Fields(2) = Trim(txtDirector.Text)
mrc.Fields(3) = Trim(txtClassroom.Text)
mrc.Update '更新数据库
mrc.Close '关闭数据库
MsgBox "添加班级信息成功!", vbOKOnly +vbExclamation, "添加班级信息"
End If
那么主键到底是什么呢?
主关键字(primary key)是表中的一个或多个字段,它的值用于惟一地标识表中的某一条记录,它的值不可重复,也不可为空(NULL)。一个表中只能有一个主键。
主键设计时应该遵循什么规则:
1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。
2. 永远也不要更新主键。实际上,因为主键除了唯一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。
注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。
3. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。
4. 主键应当由计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了唯一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。