数据库表中的主键和外键
想弄清楚主键和外键,看了很多都没怎么搞明白,比如我做一个项目,实现多表查询2个表中的数据,那么这2个表是不是就必须有主键和外键。他们是怎么关联的呢?在一个表里设置主键,另...
想弄清楚主键和外键,看了很多都没怎么搞明白,比如我做一个项目,实现多表查询2个表中的数据,那么这2个表是不是就必须有主键和外键。他们是怎么关联的呢?在一个表里设置主键,另一个表设置外键,就可以说他们关联了么?搞不懂额,能不能给我举几个例子,从创建2个或者3个表开始(就是自己CREATE TABLE 表都举例出来),然后查询他们,在说说他们的关系,简单一点,不要书本文字那样我有点蒙,我一定要搞懂这个,要不愁死我了。请师兄们帮帮忙。很急。
展开
展开全部
主外键的存在是依托两个实体之间的关系而存在的;
比如班级与学生的关系:
一个班级可以有多个学生,并且一个学生只能属于一个班级,这就是一对多的关系;
那么设计数据库的时候就应该在学生表内存放班级的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,'一班')
后才能执行插入前面一条往学生表插入信息的语句..
--------------可了解一些了?真累啊.
比如班级与学生的关系:
一个班级可以有多个学生,并且一个学生只能属于一个班级,这就是一对多的关系;
那么设计数据库的时候就应该在学生表内存放班级的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,'一班')
后才能执行插入前面一条往学生表插入信息的语句..
--------------可了解一些了?真累啊.
展开全部
一般每个表建议都有主键,比如表A和表B,
A的列式(aid,aa,bb,cc),其中aid就是主键,然后B是(bid,xx,yy,ab)bid为主键,ab是外键对应A表的aid
然后你要是,然后你要查询A表中的,aa,bb及B表中的XX,YY,且要是的B中XX,YY所在列的AB要等于A表中的aid,
然后即可以这样写select ..... from A a,B b where b.ab=a.aid
外键差不多就是这样的,设置好B中的外键后,此ab的值只能是A中aid范围内的值,不能搞一个aid中都没有的值
A的列式(aid,aa,bb,cc),其中aid就是主键,然后B是(bid,xx,yy,ab)bid为主键,ab是外键对应A表的aid
然后你要是,然后你要查询A表中的,aa,bb及B表中的XX,YY,且要是的B中XX,YY所在列的AB要等于A表中的aid,
然后即可以这样写select ..... from A a,B b where b.ab=a.aid
外键差不多就是这样的,设置好B中的外键后,此ab的值只能是A中aid范围内的值,不能搞一个aid中都没有的值
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
它们都是关系数据库表设计的约束方式而已,为了保证数据库中不会出现脏数据的限制方法。
主键是数据库表的唯一索引序列,可以由多个字段组成,但每条数据的这几个字段的组合必须唯一;主键约束仅涉及本表数据;
外键是本表中该外键字段的取值要求是已经在目标表中存在的数据;假如说,表B有字段b_1是表A中字段a_1的外键,那么插入表B数据的时候,字段b_1的取值要求在表A的字段a_1的当前所有数据的值的范围内。外键是以外表数据约束本表数据的约束条件。
此外,外键还有个要求,就是a_1必须是表A的主键。并且必须说得是,外键是一个很烦人的数据库约束。
主键是数据库表的唯一索引序列,可以由多个字段组成,但每条数据的这几个字段的组合必须唯一;主键约束仅涉及本表数据;
外键是本表中该外键字段的取值要求是已经在目标表中存在的数据;假如说,表B有字段b_1是表A中字段a_1的外键,那么插入表B数据的时候,字段b_1的取值要求在表A的字段a_1的当前所有数据的值的范围内。外键是以外表数据约束本表数据的约束条件。
此外,外键还有个要求,就是a_1必须是表A的主键。并且必须说得是,外键是一个很烦人的数据库约束。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我给你解释吧!
拿你做例子喽^-9,
你们一家人在一个表中,你姥姥一家在一个表中,表中有共同的一个人,你妈妈,因为这是你的数据库,所以以你家为主,你妈妈在你家是 你爷爷的儿媳妇,地位是“儿媳妇”,到了你姥姥那边,你妈妈是 女儿,地位是“女儿”,不管到哪边,她们是一个人,是不变的,这样两家就关联起来了。
关于表是不是非有主键和外键,不一定哦,
其实可以将有主外键关系的表合并,是吧?
为什么要分开呢?主要是考虑到当数据量大的时候查询效率的问题,这个就有点难了
拿你做例子喽^-9,
你们一家人在一个表中,你姥姥一家在一个表中,表中有共同的一个人,你妈妈,因为这是你的数据库,所以以你家为主,你妈妈在你家是 你爷爷的儿媳妇,地位是“儿媳妇”,到了你姥姥那边,你妈妈是 女儿,地位是“女儿”,不管到哪边,她们是一个人,是不变的,这样两家就关联起来了。
关于表是不是非有主键和外键,不一定哦,
其实可以将有主外键关系的表合并,是吧?
为什么要分开呢?主要是考虑到当数据量大的时候查询效率的问题,这个就有点难了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼上的guoweifyj先生,我很看好你!!
你讲的非常透彻!@
你讲的非常透彻!@
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询