数据库中主外键的关系

 在做机房收费系统时,考虑到了主外键,所以学习了一下,下面我们一起来 探究一下它们的关系。

 

   主键Primary key,唯一标示一个实体。是保证数据库的实体完整性,保证数据中数据的正确性和合理性,取值非空唯一。

   外键Foreign,是用来使表与表之间联系。用来保证数据库的参照完整性,外键的取值必须来自参照表参照列的值,可以为空也可不为空。

 

    外键的作用:

   保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值!

 

    主外键的关系结构:

 

1,一对一,不用引用主外键,把它们放一个表中即可

     例如:一个学生只能有一个卡号,那么学生跟卡号放在一个表中即可

2,一对多,引用主外键,‘一’相当于主键,‘多’即是引用主键的外键。

     例如:一个班级可以有多个学生,并且一个学生只能属于一个班级,这就是一对多的关系;

3,多对多关系,需要创建一个表,表中需要两个字段,分别是引用,两个多对多字段主键的外键。
      

     例如:


学生表(学号,姓名,…………)主键:学号
课程表(课程号,课程名,…………)主键:课程号
一个学生能选多门课,一个课可以由多个学生选,即是多对多关系,
那么成绩表就是它们之间关系的体,
即引用成绩表(学号,课程号,成绩)。这里学号和课程号,分别是学生表和课程表中学号和课程号的外键

在我们现在这个阶段中,主要还是使用,主外键间的一对多的关系

 

下面一起来简单看一下大概建成的表结构

 

  1. <span style="font-family:KaiTi_GB2312;font-size:24px;">--建班级表  
  2.   
  3. create table class(  
  4.   
  5. classid int primary key,--定义班级ID为主键  
  6.   
  7. classname varchar(15)  
  8.   
  9. )  
  10. </span>  


  1. <span style="font-family:KaiTi_GB2312;font-size:24px;">--建学生表  
  2.   
  3. create table students(  
  4.   
  5. studentid int primary key,--定义学生ID为主键  
  6.   
  7. classid int ,--外键值,跟班级表classid 属性类型相同  
  8.   
  9. stuname varchar(20),--学生姓名  
  10. </span>  


  1. <span style="font-family:KaiTi_GB2312;font-size:24px;">---定义外键  
  2.   
  3. foreign key(classid) references class(classid) --本表classid是基于class表classid的外键  
  4.   
  5. )  
  6. </span>  


   如上定义了主外键后,两个表间的关系就是一对多的关系了,并且学生表内的classid必须依托班级表的classid存在,也就是说外键必须要主键存在的时候才能创建,

 

例如:

 

--在班级表为空的情况往学生表插入一条记录是不允许的:

  1. <span style="font-family:KaiTi_GB2312;font-size:24px;">insert intostudents(studentid,classid,stuname)values(1,1,'小明')</span>  


 系统会抛出异常提示主键表班级表内班级ID不存在这样是不允许插入的;

必须要先往班级表内插入一条记录:

  1. <span style="font-family:KaiTi_GB2312;font-size:24px;">insert into class(classid,classname)values(1,'一班')</span>  


 后才能执行插入前面一条往学生表插入信息的语句..

 

   解释:

 

   对于机房收费系统来说,如图:

 

    只有当学生注册了信息,有了卡号,在学生信息表中存在了,才可以进行充值,退卡,上下机等,主外键的作用也就是当没有学生信息时,我们不可以进行充值等操作,而且想要删除学生信息表中的数据,必须先将充值表,退卡表,上下机表中此卡号的人删除之后才可以删除学生信息表中的数据,这样就避免了当学生未注册时,就可以充值的情况

 

    也就是说,如果主键表中数据的更改使之与外键表中数据的链接失效,则这种更改是不能实现的,从而确保了引用完整性。如果试图删除主键表中的行或更改主键值,而该主键值与另一个表的 FOREIGN KEY 约束值相关,则该操作不可实现。若要成功更改或删除 FOREIGN KEY 约束的行,可以先在外键表中删除外键数据或更改外键数据,然后将外键链接到不同的主键数据上去。

 

    外键是用来控制数据库中数据的数据完整性的 。就是当你对一个表的数据进行操作和他有关联的一个或更多表的数据能够同时发生改变,这就是外键的作用

 

连接查询与内外键的关系:

 

    连接的 连接条件:A表的主键 = B表的外键如果做连接的两表没有主外键关系,那么连接结果没有意义。

 

    例:学生表和选课表做连接,select *from 学生表,选课表where 学生表.学号(主键)=选课表.学号(外键)

 

    主外键可以建级联级触发器,用来做级联删除、更新。作用原理还是因为主外键将两表联系。


### 主键的概念 在关系数据库中,主键(Primary Key)(Foreign Key)是用于维护数据完整性建立表之间关系的重要概念。主键是一个或多个列的组合,其值能够唯一标识表中的每一行。主键具有唯一性、非空性单一性,确保每一行数据的唯一性,并作为其他表引用的基础。例如,在学生表中,每个学生的学号是唯一的,因此学号可以作为主键[^1]。 则是一个表中的字段,它与另一个表的主键相对应,用于与其他表建立联系。的主要作用是保持数据的一致性完整性。一个表可以有多个,但的值必须等于另一个表中主键的某个值,或者为空值。例如,在成绩表中,学号课程号的组合可以作为主键,而学号本身则是学生表的[^4]。 ### 主键关系 主键之间关系是通过参照完整性来实现的。主键所在的表称为主表(父表),而所在的表称为从表(子表)。当定义一个后,不允许删除主表中具有关联关系的行,从而确保数据的一致性[^3]。 在实际应用中,主键的设置有助于减少数据冗余,并确保表之间的数据连接。例如,在学生表成绩表之间,成绩表中的学号是学生表的,这使得成绩表能够与学生表建立联系,从而确保数据的一致性。 ### 示例 考虑一个简单的数据库设计,包含学生表、课程表成绩表: - **学生表**(学号,姓名,性别,班级):学号是主键。 - **课程表**(课程编号,课程名,学分):课程编号是主键。 - **成绩表**(学号,课程号,成绩):学号课程号的组合是主键,而学号是学生表的,课程号是课程表的。 通过这种设计,成绩表能够与学生表课程表建立联系,从而确保数据的一致性完整性[^2]。 ### 代码示例 以下是一个简单的SQL语句示例,用于创建上述三个表并设置主键约束: ```sql -- 创建学生表 CREATE TABLE Students ( StudentID INT PRIMARY KEY, Name VARCHAR(100), Gender VARCHAR(10), Class VARCHAR(50) ); -- 创建课程表 CREATE TABLE Courses ( CourseID INT PRIMARY KEY, CourseName VARCHAR(100), Credits INT ); -- 创建成绩表,并设置 CREATE TABLE Grades ( StudentID INT, CourseID INT, Grade DECIMAL(5,2), PRIMARY KEY (StudentID, CourseID), FOREIGN KEY (StudentID) REFERENCES Students(StudentID), FOREIGN KEY (CourseID) REFERENCES Courses(CourseID) ); ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值