一个班级可以有多个学生,并且一个学生只能属于一个班级,这就是一对多的关系;
那么设计数据库的时候就应该在学生表内存放班级的ID作为外键,为什么不在班级表内放学生呢?
因为,你想一想班级表内如果放学生那么记录可能就是这样:
1班ID
1班
xx同学id
1班ID
1班
xx同学id
..
这是不允许的,班级表内班级为主键,是唯一的不允许相同记录的;
下面简单给你讲下大概建成的表结构
--建班级表
create
table
class(
classid
int
primary
key,--定义班级ID为主键
classname
varchar(15)
)
--建学生表
create
table
students(
studentid
int
primary
key,--定义学生ID为主键
classid
int
,--外键值,跟班级表classid
属性类型相同
stuname
varchar(20),--学生姓名
---定义外键
foreign
key(classid)
references
class(classid)
--本表classid是基于class表classid的外键
)
---------
如上定义了主外键后,两个表间的关系就是一对多的关系了,并且学生表内的classid必须依托班级表的classid存在,也就是说外键必须要主键存在的时候才能创建,例如:
--在班级表为空的情况往学生表插入一条记录是不允许的:
insert
into
students(studentid,classid,stuname)values(1,1,'小明')
系统会抛出异常提示主键表班级表内班级ID不存在这样是不允许插入的;
必须要先往班级表内插入一条记录:
insert
into
class(classid,classname)values(1,'一班')
后才能执行插入前面一条往学生表插入信息的语句..
--------------可了解一些了?真累啊.
数据库的约束是为了体现数据库完整性的。实体完整性有primary key (主键)
参照完整性有foreign key (外键)
用户自定义完整性有:列表非空(NOT NULL),列表唯一(UNIQUE),
检查列值是否满足一个布尔表达式(CHECK)
通常就上面这5个了
后面更深还会有其他的,但是估计你现在还不用
现在我给你解释,主外键
主键就是在一个表中,能够唯一代表各元组值得
就像我们的身份z号,全世界只有一个,是独一无二的属性
外键就是在一个表中,参照其他表中的主键的本表属性
就像在SC表中有Sno不是主键,但它参照了S表中的主键Sno,所以Sno在SC表中就是外键啦
希望我的回答能让你理解这中知识。
不懂可以再问
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)