数据库关系表(关系数据库表之间有哪几种关系类型)
大家好,今天来为大家解答数据库关系表这个问题的一些问题点,包括关系数据库表之间有哪几种关系类型也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
数据库中如何建立表的参照关系
参照关系就是主外键,其最重要的作用是保护你的数据的完整性。
SQL的主键和外键的作用:
外键取值规则:空值或参照的主键值。
(1)插入非空值时,如果主键表中没有这个值,则不能插入。
(2)更新时,不能改为主键表中没有的值。
(3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。
(4)更新主键记录时,同样有级联更新和拒绝执行的选择。
简而言之,SQL的主键和外键就是起约束作用。
关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键。
比如:
学生表(学号,姓名,性别,班级)
其中每个学生的学号是唯一的,学号就是一个主键;
课程表(课程编号,课程名,学分)
其中课程编号是唯一的,课程编号就是一个主键;
成绩表(学号,课程号,成绩)
成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以,学号和课程号的属性组是一个主键。
成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键;同理,成绩表中的课程号是课程表的外键。
定义主键和外键主要是为了维护关系数据库的完整性,总结一下:
一、主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。
二、主键、外键和索引的区别
定义:
主键--唯一标识一条记录,不能有重复的,不允许为空
外键--表的外键是另一表的主键,外键可以有重复的,可以是空值
索引--该字段没有重复值,但可以有一个空值
作用:
主键--用来保证数据完整性
外键--用来和其他表建立联系用的
索引--是提高查询排序的速度
个数:
主键--主键只能有一个
外键--一个表可以有多个外键
索引--一个表可以有多个唯一索引
创建SQL的主键和外键约束的方法:
create table Student--建表格式:create table自定义的表名
(--字段名一般为有一定意义的英文
StudentName nvarchar(15),--格式:字段名类型()括号里面的是允许输入的长度
StudentAge int,--int型的后面不需要接长度
StudentSex nvarchar(2)--最后一个字段后面不要逗号
)
--在创建表时就可以对字段加上约束:
create table Student
(
StudentNo int PRIMARY KEY IDENTITY(1,1),--加主键约束,还有标识列属性(两者构成实体完整性)
StudentName nvarchar(15) not null,--加非空约束,不加"not null"默认为:可以为空
StudentSchool text(20) FOREIGN KEY REFERENCES SchoolTable(SchoolName),--加外键约束,格式:FOREIGN KEY REFERENCES关联的表名(字段名)
StudentAge int DEFAULT((0)),--加默认值约束
StudentSex nvarchar(2) CHECK(StudentSex=N'男' or StudentSex=N'女')--加检查约束,格式:check(条件表达式)
)
--如果在表创建好了以后再加约束,则格式分别为:
--主键:
alter table表名
add constraint PK_字段名--"PK"为主键的缩写,字段名为要在其上创建主键的字段名,'PK_字段名'就为约束名
primary key(字段名)--字段名同上
--唯一约束:
alter table表名
add constraint UQ_字段名
unique(字段名)
--外键约束:
alter table表名
add constraint FK_字段名--"FK"为外键的缩写
foreign key(字段名) references关联的表名(关联的字段名)--注意'关联的表名'和'关联的字段名'
alter table表A add constraint FK_B foreign key(ticket_no) references表B(ticket_no)
alter table表A add constraint FK_C foreign key(person_no) references表C(person_no)
alter table成绩表 add constraint FK_StudentNo foreign key(StudentNo) references Student(StudentNo)
ON UPDATE CASCADE ON DELETE CASCADE
级联更新,级联删除,这样在删除主表Student时,成绩表中该学生的所有成绩都会删除。
--检查约束:
alter table表名
add constraint CK_字段名
check(条件表达式)--条件表达式中的条件用关系运算符连接
--默认值约束:
alter table表名
add constraint DF_字段名
default'默认值' for字段名--其中的'默认值'为你想要默认的值,注意'for'
--删除创建的约束:
alter table表名
drop constraint约束名--约束名为你前面创建的如:PK_字段这样的约束名
--注意:如果约束是在创建表的时候创建的,则不能用命令删除
--只能在'企业管理器'里面删除
--获取SqlServer中表结构
SELECT syscolumns.name,systypes.name,syscolumns.isnullable,
syscolumns.length
FROM syscolumns,systypes
WHERE syscolumns.xusertype= systypes.xusertype
AND syscolumns.id= OBJECT_ID('Student')
--单独查询表递增字段
SELECT [name] FROM syscolumns WHERE
id= OBJECT_ID(N'Student') AND COLUMNPROPERTY(id,name,'IsIdentity')=1
--获取表主外键约束
EXEC sp_helpconstraint'StuResults'
--查询表主键外键信息
SELECT sysobjects.id objectId,OBJECT_NAME(sysobjects.parent_obj) tableName,
sysobjects.name constraintName, sysobjects.xtype AS constraintType,
syscolumns.name AS columnName
FROM sysobjects INNER JOIN sysconstraints
ON sysobjects.xtype in('C','F','PK','UQ','D')
AND sysobjects.id= sysconstraints.constid
LEFT OUTER JOIN syscolumns ON sysconstraints.id= syscolumns.id
WHERE OBJECT_NAME(sysobjects.parent_obj)='StuResults'
数据库表与表之间的关系
表与表之间一般存在三种关系,即一对一,一对多,多对多关系。
例如:一个人可以拥有多辆汽车,要求查询某个人拥有的所有车辆。
分析:这种情况其实也可以采用一张表,但因为一个人可以拥有多辆汽车,如果采用一张表,会造成冗余信息过多。好的设计方式是,人和车辆分别单独建表,那么如何将两个表关联呢?有个巧妙的方法,在车辆的表中加个外键字段(人的编号)即可。
例如:学生选课,一个学生可以选修多门课程,每门课程可供多个学生选择。
分析:这种方式可以按照类似一对多方式建表,但冗余信息太多,好的方式是实体和关系分离并单独建表,实体表为学生表和课程表,关系表为选修表,其中关系表采用联合主键的方式(由学生表主键和课程表主键组成)建表。
什么是视图?
在 SQL中,视图是基于 SQL语句的结果集的可视化的表。
第一点:
使用视图,可以定制用户数据,聚焦特定的数据。
解释:
在实际过程中,公司有不同角色的工作人员,我们以销售公司为例的话,
采购人员,可以需要一些与其有关的数据,而与他无关的数据,对他没
有任何意义,我们可以根据这一实际情况,专门为采购人员创建一个视
图,以后他在查询数据时,只需select* from view_caigou就可以啦。
第二点:使用视图,可以简化数据操作。
解释:我们在使用查询时,在很多时候我们要使用聚合函数,同时还要
显示其它字段的信息,可能还会需要关联到其它表,这时写的语句可能
会很长,如果这个动作频繁发生的话,我们可以创建视图,这以后,我
们只需要select* from view1就可以啦~,是不是很方便呀~
第三点:使用视图,基表中的数据就有了一定的安全性
因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,我们可以
将基表中重要的字段信息,可以不通过视图给用户,视图是动态的数据的集
合,数据是随着基表的更新而更新。同时,用户对视图,不可以随意的更改
和删除,可以保证数据的安全性。
第四点:可以合并分离的数据,创建分区视图
随着社会的发展,公司的业务量的不断的扩大,一个大公司,下属都设有很
多的分公司,为了管理方便,我们需要统一表的结构,定期查看各公司业务
情况,而分别看各个公司的数据很不方便,没有很好的可比性,如果将这些
数据合并为一个表格里,就方便多啦,这时我们就可以使用union关键字,
将各分公司的数据合并为一个视图。
以上,就是我认为视图的作用,实际上很多公司都使用视图来查询数据的。
内连接:只连接匹配的行
SELECT* from gradeclass gc inner join grade g on gc.grade_id=g.Id,
左外连接:包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
select* from grade g rigth OUTER JOIN gradeclass g on g.grade_id=gc.Id(这里的outer可以省略)
右外连接:包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
select* from grade g rigth OUTER JOIN gradeclass g on g.grade_id=gc.Id(这里的outer可以省略)
全外连接:包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。
交叉连接:生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配
什么是数据库表
在关系数据库中,数据库表是一系列二维数组的集合,用来代表和储存数据对象之间的关系。它由纵向的列和横向的行组成;
例如一个有关作者信息的名为 authors的表中,每个列包含的是所有作者的某个特定类型的信息,比如“姓氏”,而每行则包含了某个特定作者的所有信息:姓、名、住址等等。
对于特定的数据库表,列的数目一般事先固定,各列之间可以由列名来识别。而行的数目可以随时、动态变化,每行通常都可以根据某个(或某几个)列中的数据来识别,称为候选键。
DataTable架构定义
表的架构(即结构)由列和约束表示。使用 DataColumn对象以及 ForeignKeyConstraint和 UniqueConstraint对象定义 DataTable的架构。表中的列可以映射到数据源中的列、包含从表达式计算所得的值、自动递增它们的值,或包含主键值。
按名称引用表中的列、关系和约束是区分大小写的。因此,一个表中可以存在两个或两个以上名称相同(但大小写不同)的列、关系或约束。例如,您可以有Col1和col1。
以上内容参考:百度百科-数据库表
关系数据库表之间有哪几种关系类型
1)一对一的关系
例如:一个人对应一个唯一的身份证号,即为一对一的关系。
2)一对多关系
例如:一个班级对应多名学生,即为一对多关系
3)多对多关系
例如:一个学生可以选多门课程,而同一门课程可以被多个学生选修,彼此的对应关系即是多对多关系。
OK,关于数据库关系表和关系数据库表之间有哪几种关系类型的内容到此结束了,希望对大家有所帮助。