语句注主键与外键的定义子句)(精)
数据库主键和外键的作用

数据库主键和外键的作用首先介绍一下什么是主键、什么是外键。
1 什么是主键外键学生表(学号,姓名,性别,班级) 学号是一个主键课程表(课程号,课程名,学分)课程号是一个主键成绩表(学号,课程号,成绩)学号和课程号的属性组构成一个主键成绩表中的学号不是成绩表的主键,不过是学生表的主键,成绩表的外键,同理课程号也是成绩表的外键定义:如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键以一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表2 外键的作用外键用于保持数据一致性,完整性主要目的是控制存储在外键表中的数据3 主键的设计原则1)主键应当是对用户没有意义的2)主键应该是单列的,以提高连接和筛选操作的效率复合键的使用通常出于两点考虑:a)主键应当具有意义-----这为认为的破坏数据库提供了方便b)在描述多对多关系的连接表中可以使用两个外部键作为主键------该表可能成为其他从表的主表,并成为从表的主键的一部分,使得之后的从表包含更多的列3)永远不要更新主键4)主键不应该包含动态变化的数据(时间戳等)5)主键应当由计算机自动生成4 数据库主键选取策略建立数据库的时候,需要为每张表指定一个主键(一个表只能有一个主键,但是可以有多个候选索引)常见的主键选取方式有:1)自动增长型字段自动增长型主键会省略很多繁琐的工作,但在数据缓冲模式下,不能预先填写主键与外键的值Order(OrderID,OrderDate) //主键OrderID是自动增长型字段OrderDetail(OrderID,LineNum,ProductID,Price)如果要在Order表中插入一条记录,在OrderDetail表中插入若干条记录,为了能在OrderDetail表中插入正确的OrderID字段,必须先更新Order表以获得系统系统分配的OrderID,但是为了确保数据一致性,Order表和OrderDetail表必须在事务保护下同时进行更新,这显然是矛盾的除此之外,当需要在多个数据库之间进行数据复制时,自动增长型字段可能造成主键冲突2)手动增长型字段3)使用UniqueIdentifier SQL Server提供一个UniqueIdentifier数据类型(16字节),并提供一个生成函数NEWID(),生成一个唯一的UniqueIdentifier4)使用COMB类型保留UniqueIdentifier的前10字节,后6字节表示生成时间---------------------------------------------------------------------------------------------------------------------- 1 外键外键(FK)是用于建立或加强两个表数据之间的链接的一列或多列。
主键,外键,视图,索引

4.索引(Index):
索引,[1]使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构,例如 employee 表的姓名(name)列。如果要按姓查找特定职员,与必须搜索表中的所有行相比索引会帮助您更快地获得该信息。
1.主键(Primary Key):
数据表里的主键创建一般是唯一的,也就是说在一个表格里最多可以创建一个主键;当然创建逐渐的类型有两种,分为 单一列作为主键和组合主键,其中组合主键就是两个列或多个列组合为主键,这在SQL数据操作中用的不是很多;
主要记住主键的创建规则,唯一且不能为空
2.外键(Foreign Key):
换而言之,如果关系模式R中的某属性集不是R的主键,而是另一个关系R1的主键则该属性集是关系模式R的外键,通常在数据库设计中缩写为FK。
外键 --------> 外键就是指:另外表中是主键 。
3.视图(View):
计算机数据库中的视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。也是机械制图术语,在机械制图中,将物体按正投影法向投影面投射时所得到的投影称为“视图”。
SQL关于外键和主键的理解

use mastergoif exists (select * from sysobjects where name='player')drop table Weapon--武器表(主表)create table Weapon(WeaponID int identity(1,1) primary key,Wnane varchar(20) not null)--绝技表(主表)if exists (select * from sysobjects where name='Skill')drop table Skillcreate table Skill( SkillID int identity(1,1) primary key,Sname varchar(20)not null unique)if exists (select * from sysobjects where name='player')drop table player--选手表(子表)create table player( pid int identity(1,1) primary key,pname varchar(20) not null,weaponid int foreign key references Weapon(WeaponID),--字表中(player)有两个外键存在,skillid int foreign key references Skill(SkillID)--它们所对应的主表是)--也可以这样理解只有在子表中存在外键--给几张表赋值--武器表,先用一次只添加一条数据的方法来添加insert into Skill values('我用流拳法')--一次添加多条数据insert into Skillselect '射击' unionselect '我流星格斗技' unionselect '杰夫流喧哗杀法'unionselect '骨法'select * from Skill -- 此表中存在SkillID为2或者WeaponID为2,所以在可以把skillid和weaponid全部修改为2--如果修改为除了1,2,3,5,6的值将不会修改成功--向Weapon表中添加数据insert into Weaponselect '枪' unionselect '铁锤' unionselect '棍' unionselect '扇子' unionselect '花拳秀腿'select * from Weapon-- 道理同上--向player(子表)添加数据insert into playerselect '李小龙', 1,2(主表中一定存在一个2这样的值,子表中才能添加) union select '后裔', 2,3 unionselect '金轮法王',3,4 unionselect '郭芙荣', 4,5 unionselect '洪七公', 6,1select * from player--修改IDupdate player set WeaponID=5update player set SkillID=5select * from player--可以修改player(子表)中weaponid(外键列)和skillid(外键列)--因为它们两个是子表2中的列weaponid和列skillid不能修改主表(Skill)中的SkillID,但可以修改字表中的SkillID,因为主表中的是有表示列存在的不允许被修改的还有外键要添加的数据,一定要在主键中能找到与之对应的才行。
MySQL中的主键与外键关系解析

MySQL中的主键与外键关系解析MySQL是一种常用的关系型数据库管理系统,被广泛应用于各种网络应用和企业级系统中。
在MySQL中,主键和外键是两个非常重要的概念。
本文将深入解析MySQL中的主键与外键关系,探讨其作用、用法以及相关注意事项。
一、主键的概念与作用主键(Primary Key)是在表中唯一标识每一条记录的一列或一组列。
它具有以下作用:1. 唯一性约束:主键要求每个记录在主键列上的值都是唯一的,不允许重复。
2. 快速索引:主键列会自动在数据库中创建索引,这使得通过主键进行查询和排序等操作更加高效。
3. 数据完整性保护:主键可以保证数据库中的数据完整性,防止数据重复、数据丢失等问题。
二、主键的定义与使用在MySQL中定义主键有两种常见的方式:1. 在创建表时定义主键:```CREATE TABLE 表名 (列名数据类型 PRIMARY KEY,...);```在创建表的过程中,可以通过在列的定义后添加PRIMARY KEY关键字来指定该列作为主键。
如果一个表中存在多个列,也可以将多个列组合成一个主键。
2. 修改已存在的表添加主键:```ALTER TABLE 表名ADD PRIMARY KEY (列名);```使用ALTER TABLE语句可以向已存在的表中添加主键。
在列名后添加PRIMARY KEY关键字即可。
主键的使用需要注意以下几点:1. 主键列的值不能为空:为了保证唯一性约束,主键列的值不能为空。
可以通过在列的定义时添加NOT NULL关键字来确保该列不为空。
2. 主键的选择:主键应该是一个稳定且唯一的值。
一般情况下,可以选择自增长的整数作为主键,也可以选择字符串类型的列,只要保证该列的值在整个表中唯一。
3. 主键的更新:一旦表中的数据被创建,主键的值就不能被更新。
如果需要更改主键的值,只能通过删除原记录,然后插入新记录的方式来实现。
三、外键的概念与作用外键(Foreign Key)是用于建立表与表之间联系的一列或一组列。
外键定义规则

外键定义规则
外键的定义及规则如下:
外键的定义:在数据库中,外键是指一个表中的一个或多个字段,它们的值必须与另一个表中的某个字段的值相匹配。
这个被匹配的字段通常是另一个表的主键。
外键可以用来建立表与表之间的关系,从而实现数据的关联和查询。
外键的规则:外键是参照完整性的一部分,用于确保引用完整性。
外键的值必须是另一个表的主键值,或者是空值。
具体规则如下:
1.每个外键必须引用一个表中的主键。
2.不能引用另一个表的非主键列。
3.外键列中的任何值必须在被引用的表中存在。
4.外键列中的值必须匹配被引用列的数据类型和约束。
5.外键列不能包含空值(除非被引用的列允许空值)。
6.外键列中的值必须保持有效,即当被引用的主键值更改或删除时,外键值也需要相应地
更改或删除。
7.外键可以是一个表的单列或多列的组合,作为另一个表的外键。
8.外键的命名通常遵循一定的规范,例如使用“FK_”作为前缀,后面跟着简短的描述性
名称。
9.外键的创建方式也因不同的数据库系统而异,需要根据具体的数据库系统文档进行操
作。
在实际操作中,将一个表的值放入第二个表来表示关联,所使用的值是第一个表的主键值(在必要时可包括复合主键值)。
此时,第二个表中保存这些值的属性称为外键(foreign key)。
外键的作用是保证参照完整性,防止无效数据的引入。
数据库中的主键与外键的关系,通俗易懂

数据库中的主键与外键的关系,通俗易懂在设计关系型数据库时,主键和外键是两个非常重要的概念。
主键和外键之间有密切的关系,它们在数据库中起着至关重要的作用。
本文将介绍主键和外键及其之间的关系,旨在让读者更好地理解这些概念。
一、主键的定义主键是指在关系数据库中唯一标识一条记录的字段或一组字段。
它能够保证数据库表中每个元素的唯一性,即每个元素都有其独特的主键值。
主键通常包括表中的一个或多个列,能够帮助我们更快速地搜索、更新、删除数据。
例如,在一个存储学生信息的表中,每个学生都有唯一的学号,因此可以将学号设为主键。
二、外键的定义外键是指在关系数据库中链接两个表之间关系的一列或多列。
它指向另一个表的主键,并且其值必须与那个主键相对应。
外键可用于保证数据完整性,例如在一个课程表和学生信息表中,课程表中可以使用学生信息表的学号列作为外键,以表现学生和其所选课程之间的关系。
三、主键和外键的关系在关系型数据库中,主键和外键之间的关系非常密切。
通过主键和外键的链接,我们可以建立不同表之间的关系,实现数据的连接和共享。
具体地说,主键和外键之间可以建立如下关系:1.主键可以作为外键的来源在关系型数据库中,可以将一个表的主键列引用另一个表的主键,以此建立两个表之间的关系。
这是一种非常常见的操作,例如在一个数据仓库中,可能有多个维度表与事实表共同工作,维度表中的主键被用作事实表的外键。
2.外键引用主键外键是通过引用另一个表的主键来建立的。
当在外键上插入新值时,系统会检查该值是否存在于关联的主键中。
如果值不存在,则插入操作将失败,从而保证了数据表之间的关联性和完整性。
3.主键和外键可以形成复合键在有些情况下,一个表不仅有一个主键,还有多个列,可以用这些列来联合参加主键的建立,这就是复合键。
同样,一个外键可以由多列来共同构成。
复合键的优势在于提供更严格的数据完整性约束,防止了重复数据和非法数据的产生。
总之,主键和外键是关系型数据库设计中最基本的概念之一。
SQL中的主键,候选键,外键,主码,外码

SQL中的主键,候选键,外键,主码,外码1、码=超键:能够唯⼀标识⼀条记录的属性或属性集。
标识性:⼀个数据表的所有记录都具有不同的超键⾮空性:不能为空有些时候也把码称作“键”2、候选键=候选码:能够唯⼀标识⼀条记录的最⼩属性集标识性:⼀个数据表的所有记录都具有不同的候选键最⼩性:任⼀候选键的任何真⼦集都不能唯⼀标识⼀个记录(⽐如在成绩表中(学号,课程号)是⼀个候选键,单独的学号,课程号都不能决定⼀条记录)⾮空性:不能为空候选键是没有多余属性的超键举例:学⽣ID是候选码,那么含有候选码的都是码。
少部分地⽅也有叫超级码的,但是见得不多3、主键=主码:某个能够唯⼀标识⼀条记录的最⼩属性集(是从候选码⾥⼈为挑选的⼀条)唯⼀性:⼀个数据表只能有⼀个主键标识性:⼀个数据表的所有记录都具有不同的主键取值⾮空性:不能为空⼈为的选取某个候选码为主码4、主属性包含在任⼀候选码中的属性称主属性。
简单来说,主属性是候选码所有属性的并集⾮主属性不包含在候选码中的属性称为⾮主属性。
⾮主属性是相对于主属性来定义的。
5、外键(foreign key):⼦数据表中出现的⽗数据表的主键,称为⼦数据表的外键。
6、全码:当所有的属性共同构成⼀个候选码时,这时该候选码为全码。
(教师,课程,学⽣)假如⼀个教师可以讲授多门课程,某门课程可以有多个教师讲授,学⽣可以听不同教师讲授的不同课程,那么,要区分关系中的每⼀个元组,这个关系模式R的候选码应为全部属性构成(教师、课程、学⽣),即主码。
7、代理键:当不适合⽤任何⼀个候选键作为主键时(如数据太长等),添加⼀个没有实际意义的键作为主键,这个键就是代理键。
(如常⽤的序号1、2、3)8、⾃然键:⾃然⽣活中唯⼀能够标识⼀条记录的键(如⾝份证)。
主键和外键——精选推荐

主键和外键
1:主键和外键的定义
主键(primary key):⼀列(或⼀组列),其值能够唯⼀区分表中每个⾏。
外键(foreign key)外键为某个表中的⼀列,它包含另⼀个表的主键值,定义了两个表之间的关系
借⽤其他博客中的三个数据表解析⼀下:
学⽣表(学号,姓名,性别,班级) // 学号唯⼀,能确定学⽣表的⼀⾏
课程表(课程编号,课程名,学分) // 课程编号唯⼀,能确定课程表的⼀⾏
成绩表(学号,课程号,成绩) // 学号和课程号才能唯⼀确定哪个⼈哪门课得了多少分,学号和课程号这两列为主键
2:是哪个表的外键?
以上⾯的成绩表为例,学号和课程号是成绩表的主键,那么学号是成绩表的外键还是学⽣表的外键?当然是成绩表的外键,因为学号是学⽣表的主键呀,怎么可能是外键?同理成绩表课程号也应该是成绩表的外键。
其实,外键主要建⽴与其他表的联系,如果我们想知道成绩表中某⼀⾏成绩是谁考的,啥性别,在哪个班级,就可通过成绩表的外键学号与学⽣表建⽴⼀种关系。
看了⽹上某些博客有点绕,不懂还是先查书吧。
以上参考书籍为《MySQL必知必会》,不错的⼀本⼩册⼦。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、建表(create table 语句。
注:主键与外键的定义子句)create table student(student_id char(6) not null primary key,student_name varchar(20) not null,class varchar(16) ,sex tinyint ,birthday datetime ,credit tinyint ,notes varchar(50))create table course(course_id char(3) primary key,course_name varchar(16) ,term tinyint ,course_time tinyint ,credit tinyint)create table result(student_id char(6) ,course_id char(3) ,grade tinyint ,credit tinyint ,constraint pk_result primary key (student_id,course_id),Constraint fk_result foreign key (course_id) references course (course_id) )二、修改表结构(alter table, drop table语句)1.在表XS中增加1个新列——奖学金等级ALTER TABLE XSADD奖学金等级tinyint NULL2.在表XS中删除名为奖学金等级的列ALTER TABLE XSDROPCOLUMN 奖学金等级3.修改表XS中已有列的属性ALTER TABLE XSALTER COLUMN 姓名char(10)4.删除表XSDROP TABLE XS三、修改表数据(insert,delete,update语句)1.向XSCJ数据库的表XS中插入如下的一行:001112 罗林琳计算机0 “1/30/1980 0:0:0” 40INSERT INTO XSV ALUES(‘001112’,’罗林琳’,’计算机’, 0 ,‘1/30/1980 0:0:0’, 40,NULL)2.将XS表中总学分小于39的行删除DELETE FROM XSWHERE 总学分<393.XS表中学号为001110的学生的备注列值改为“三好生”UPDATE XSSET 备注=‘三好生’WHERE 学号=‘001110’4.将XS表中的所有学生的总学分都增加10UPDATE XSSET 总学分= 总学分+105.将姓名为“罗林琳”的同学的专业改为“通信工程”,备注改为“转专业学习”,学号改为001241。
UPDATE XSSET 专业= ‘通信工程’,备注= ‘转专业学习’,学号= ‘001241’WHERE 姓名= ‘罗林琳’6.对XS表进行修改,将姓名为“李明”的学生的总学分加4,备注改为“提前修完《数据结构》,并获得学分”UPDATE XSSET 总学分= 总学分+ 4,备注= ‘提前修完《数据结构》,并获得学分’WHERE 姓名=’ 李明’四、查询语句:(select)1.常规查询SELECT 姓名,专业名,总学分FROM X2.带Where子句的查询SELECT 学号,姓名,总学分FROM XSWHERE 专业名= '计算机'3.查询所有列SELECT *FROM XS4.别名SELECT 学号AS number,姓名AS name,总学分AS markFROM XSWHERE 专业名= '计算机'5.别名用法之二SELECT number = 学号,name = 姓名,mark = 总学分FROM XSWHERE 专业名= '计算机'6.产生计算列SELECT CPMC AS '产品名称',产品总值= JG * KCLFROM CP7.去除重复记录SELECT DISTINCT 专业名,总学分FROM XS8.查出前几条SELECT TOP 6 姓名,专业名,总学分FROM XS9.不等号的使用SELECT *FROM CPWHERE KCL!< 50010. 多字段限制条件SELECT *FROM XSWHERE 专业名= '通信工程' and 总学分>= 4211.like的使用SELECT *FROM XSWHERE 专业名LIKE '计算机'SELECT *FROM CPWHERE CPMC LIKE '%冰箱%'SELECT *FROM XSWHERE 姓名LIKE '王_'12.between的使用SELECT *FROM CPWHERE JG BETWEEN 2000 AND 400013.in的使用SELECT *FROM XSWHERE 专业名IN ('计算机','通信工程','无线电')14.空字段的判断SELECT *FROM XSWHERE 备注IS NULL15.多表连接SELECT XS.* , XS_KC.*FROM XS , XS_KCWHERE XS.学号= XS_KC.学号--查找选修了206课程且成绩在80分以上的学生姓名及成绩SELECT 姓名, 成绩FROM XS , XS_KCWHERE XS.学号= XS_KC.学号AND 课程号='206'AND 成绩>= 80--查找选修了“计算机基础”课程且成绩在80分以上的学生学号、姓名、课程名及成绩。
SELECT XS.学号, 姓名, 课程名, 成绩FROM XS , KC , XS_KCWHERE XS.学号= XS_KC.学号AND KC.课程号= XS_KC.课程号AND 课程名= '计算机基础' AND 成绩>= 80--查找XSCJ数据库每个学生的情况以及选修的课程情况SELECT *FROM XS INNER JOIN XS_KCON XS.学号= XS_KC.学号--查找选修了206课程且成绩在80分以上的学生姓名及成绩。
SELECT 姓名, 成绩FROM XS JOIN XS_KC ON XS.学号= XS_KC.学号WHERE 课程号='206' AND 成绩>=8016.聚合函数--求选修101课程的学生的平均成绩。
SELECT A VG(成绩) AS '课程101平均成绩'FROM XS_KCWHERE 课程号= '101'--求选修101课程的学生的最高分和最低分。
SELECT MAX(成绩) AS '课程101的最高分' , MIN(成绩) AS '课程101的最低分' FROM XS_KCWHERE 课程号= '101'--求学生的总人数。
SELECT COUNT(*) AS '学生总数'FROM XS--求选修了课程的学生总人数。
SELECT COUNT(DISTINCT 学号)FROM XS_KC--将XSCJ数据库中各专业名输出。
SELECT 专业名FROM XSGROUP BY 专业名--求XSCJ数据库中各专业的学生数。
SELECT 专业名,COUNT(*) AS '学生数'FROM XSGROUP BY 专业名--求被选修的各门课程的平均成绩和选修该课程的人数SELECT 课程号, A VG(成绩) AS '平均成绩' ,COUNT(学号) AS '选修人数' FROM XS_KCGROUP BY 课程号--查找XSCJ数据库中平均成绩在85分以上的学生的学号和平均成绩。
SELECT 学号, A VG(成绩) AS '平均成绩'FROM XS_KCGROUP BY 学号HA VING A VG(成绩) > =85--查找选修课程超过2门且成绩都在80分以上的学生的学号。
SELECT 学号FROM XS_KCWHERE 成绩>= 80GROUP BY 学号HA VING COUNT(*) > 2'--查找通信工程专业平均成绩在85分以上的学生的学号和平均成绩。
SELECT 学号,A VG(成绩) AS '平均成绩FROM XS_KCWHERE 学号IN( SELECT 学号FROM XSWHERE 专业名= '通信工程')GROUP BY 学号HA VING A VG(成绩) > =8517.排序--将通信工程专业的学生按出生时间先后排序。
SELECT *FROM XSWHERE 专业名= '通信工程'ORDER BY 出生时间--将计算机专业学生的“计算机基础”课程成绩按降序排列。
SELECT 姓名,课程名,成绩FROM XS,KC,XS_KCWHERE XS.学号= XS_KC.学号AND XS_KC.课程号= KC.课程号AND 课程名= '计算机基础' AND 专业名= '计算机'ORDER BY 成绩DESC18.用into子句创建新表--由XS表创建“计算机系学生”表,包括学号和姓名。
SELECT 学号,姓名INTO计算机系学生FROM XSWHERE 专业名= '计算机'五、创建视图CREATE VIEW CS_XSASSELECT *FROM XSWHERE 专业名= '计算机'六、游标的使用游标的声明,打开,提取,关闭,释放declare total_credit cursor forselect 学号, total_credit from vw_total_creditopen total_creditfetch next from total_creditclose total_creditdeallocate total_credit七、用SET语句赋值declare @var1 varchar(20),@var2 varchar(200)set @var1='中国'set @var2=@var1 + '是一个伟大的国家'select @var1,@var2八、流程控制语句if...elsewhilebreakreturn九、字符串处理函数select substring(姓名,1,1),substring(姓名,2,len(姓名)-1) from xs order by 姓名十、游标函数@@cursor_rows@@fetch_status十一、用户自定义函数create function average(@cnum char(20)) returns intasbegindeclare @aver intselect @aver=avg(成绩) from xs_kc where 课程号=@cnumreturn @averend用户自定义函数的调用declare @course1 char(20)declare @aver1 intselect @course1='101'select @aver1=dbo.average(@course1)select @aver1 as '101课程的平均成绩'(测试select avg(成绩) from xs_kc where 课程号='101' )十二、游标与存储过程create procedure prc_update_total_creditasdeclare @number char(10),@tot_credit intdeclare total_credit cursor forselect 学号, total_credit from vw_total_creditopen total_creditfetch next from total_credit into @number ,@tot_creditupdate xs set 总学分=@tot_credit where 学号=@numberwhile @@FETCH_STATUS=0beginfetch next from total_credit into @number ,@tot_creditupdate xs set 总学分=@tot_credit where 学号=@numberendclose total_creditdeallocate total_credit注:调用该存储过程等同于语句update xs set 总学分=(select total_credit from vw_total_credit b where xs.学号=b.学号) where 学号in (select 学号from vw_total_credit)。