SQL的主键和外键约束-程序员宅基地

技术标签: 数据库  

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'

 

 

 

 

一个详细示例:

 

CREATE TABLE Student

(

    StudentNo int PRIMARY KEY IDENTITY(1,1),

    StudentName nvarchar(15) NOT NULL,

    StudentAge int DEFAULT ((0)),

    StudentSex nvarchar(2) CHECK(StudentSex=N'男' or StudentSex=N'女'),

    StudentClass nvarchar(15)

)

 

CREATE TABLE Subject

(

    SubjectNo INT PRIMARY KEY IDENTITY(1,1),

    SubjectName NVARCHAR(15) NOT NULL

)

CREATE TABLE StuResults

(

    SR_No INT PRIMARY KEY IDENTITY(1,1),

    SR_StudentNo INT,

    SR_SubjectNo INT,

    SR_Score INT CHECK (SR_Score>=0 AND SR_Score<=120)

)

 

alter table StuResults

add constraint FK_StudentNo

foreign key (SR_StudentNo) references Student (StudentNo)

 

alter table StuResults

add constraint FK_Subject

foreign key (SR_SubjectNo) references Subject (SubjectNo)

转载于:https://www.cnblogs.com/littleCode/p/3520629.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/djun0426/article/details/101181337

智能推荐

超硬核直播课 | 自主旋翼无人机主流算法、视觉SLAM基础_无人机 路径规划 深蓝-程序员宅基地

文章浏览阅读322次。视觉SLAM是通过两帧或多帧图像来估计自身的位姿变化,再通过累积位姿变化计算当前位置。视觉SLAM不仅解决了移动机器人“我在哪里”的关键问题,而且在传感器自身定位、路径规划及场景理解等问题中都有关键作用。而无人自转旋翼机是无人机与自转旋翼机的创新结合。目前旋翼无人机可以用于摄像、货物运送、勘测等领域。随着无人机承担的任务日益多样,这就对无人机的路径规划和避障技术提出了更高的要求。基于此,深蓝学院特邀高飞副研究员和高翔博士,进行为期两天的线上直播分享,通过丰富的课程,您将进一步学习自主旋翼无人机和视觉_无人机 路径规划 深蓝

java poi 水印_java解决poi导出excel文字水印,导出excel不可操作问题-程序员宅基地

文章浏览阅读1.1k次。首先需求是用户提出导出excel数据需使用水印备注其用途;其实就是在导出excel的同时带有自定义文字水印的导出。那么我们首先想到的肯定是以一个什么样的思路去解决该问题,首先查找poi导出excel有没有相关技术可以直接导出文字水印,可想而知我写了这篇博客,当然是没有一步走成的方法那么我们开始换一种思路,大家都知道图片可以添加文字水印和图片水印,那么既然图片可以添加文字水印,可能就可以想到exce..._java导出excel水印不显示中文怎么解决

【Dash搭建可视化网站】项目7: 利用 Dash实现宝可梦能力图表和可视化雷达图联动_如何搭建diy宝可梦网站-程序员宅基地

文章浏览阅读3.9k次,点赞7次,收藏20次。手动反爬虫,禁止转载:原博地址 https://blog.csdn.net/lys_828/article/details/122135788(CSDN博主:Be_melting) 知识梳理不易,请尊重劳动成果,文章仅发布在CSDN网站上,在其他网站看到该博文均属于未经作者授权的恶意爬取信息项目7:利用 Dash实现宝可梦能力图表和可视化雷达图7.1 项目完成功能预览项目完成后的预览界面如下。页面分为上下两个部分,上面是展示两列,左侧一列放置宝可梦的图片和介绍信息,右侧一例放置宝可梦能力的可视化雷_如何搭建diy宝可梦网站

java高级开发--foreach_java foreach 用外面的值-程序员宅基地

文章浏览阅读120次。原始数组的输出用for循环完成:public class TestFor { public static void main(String[] args) { int[] data = new int[] {1,2,3,4,5}; for (int i = 0; i < data.length; i++) { System.o..._java foreach 用外面的值

Docker创建tomcat容器报错standard_init_linux.go:211: exec user process caused "no such file or directory"_log":"standard_init_linux.go:211: exec user proces-程序员宅基地

文章浏览阅读1.1w次。Tomcat创建容器之前使用命令docker pull tomcatdocker run -it -P tomcat报如下错误:standard_init_linux.go:211: exec user process caused "no such file or directory"解决方案:改用其他tomcat镜像创建Tomcat容器并运行,执行成功docker r..._log":"standard_init_linux.go:211: exec user process caused \"no such file or

安卓线程学习四 之 线程优先级和调度_set_sched_policy-程序员宅基地

文章浏览阅读3.6k次,点赞2次,收藏3次。一 问题思考安卓开发,如果想设置线程优先级有两种方法:1 Android sdk也提供一个设置线程优先级的方法2 Thread.java里面提供了设置线程优先级的方法这两个方法有什么区别,应该选择使用哪一个呢?二 线程优先级的原理2.1. android.os.process.java设置线程优先级源码分析/** * Set the priorit..._set_sched_policy

随便推点

MT6853平台camera上电基本流程_imgsensor_hw_power_sequence-程序员宅基地

文章浏览阅读1.1k次,点赞4次,收藏13次。mt6853-master\drivers\misc\mediatek\imgsensor\src\common\v1_1\imgsensor.c初始化kernelmodule_init(imgsensor_init);static int __init imgsensor_init(void){ PK_DBG("[camerahw_probe] start\n"); //注册一个平台驱动gimgsensor_platform_driver if (platform_driver_regis_imgsensor_hw_power_sequence

Organising the Organisation(uva10766)(生成树计数)-程序员宅基地

文章浏览阅读195次。InputOutputSample Input5 5 23 13 44 51 45 34 1 11 43 0 2Sample Output383题意:有一张图上有\(n\)个点,两两之间有一条边,现在切断\(m\)条边,求剩下的图中有多少种不同的生成树。题解:生成树计数做这道题,需要三个预备知识:\(Kirchhoff\)矩阵首先先构造两..._uva10766:organising the organisation kuangbin

一目了然凉哥为大家倾力打造的付费专栏_csdn付费专栏-程序员宅基地

文章浏览阅读1.8w次,点赞83次,收藏9次。大家好,我是几何心凉,欢迎来到我的付费专栏系列,本专栏将深入介绍 Vue 3 和 Vite,以及如何在 TypeScript 的帮助下构建现代化的 Web 应用程序。Vue 是一个流行的 JavaScript 框架,它允许开发人员构建高性能的用户界面,并且具有丰富的生态系统。Vue 3 是 Vue 框架的最新版本,引入了一些重要的新特性,例如基于函数的组件 API,增强的响应性系统和更好的 TypeScript 支持。_csdn付费专栏

uniapp从入门到精通(全网保姆式教程)~ 别再说你不会开发小程序了_uniapp开发小程序-程序员宅基地

文章浏览阅读3.3w次,点赞297次,收藏1.0k次。为了实现多端兼容,综合考虑编译速度、运行性能等因素,uni-app约定了如下开发规范:页面文件遵循Vue单文件组件规范组件标签靠近小程序规范,详细见uni-app组件规范接口能力(js api)靠近微信小程序规范,但需将前缀wx替换为uni,详见uni-app接口规范数据绑定及事件处理同Vue.js规范,同时补充了App以及页面的生命周期为兼容多端运行,建议使用flex布局进行开发。_uniapp开发小程序

React Native只支持输入数字和小数点 并且保留两位小数_react-native 只能输入数字和小数点-程序员宅基地

文章浏览阅读1.3k次。overMaxLength(text) { // 只支持输入数字和小数点 const numberReg = new RegExp(/^[0-9.]*$/); if(!numberReg.test(text)) { text = text.substring(0, text.length - 1); console.log('texttexttex..._react-native 只能输入数字和小数点

mugen linux主程序,Mugen主程序报错汇总-程序员宅基地

文章浏览阅读4.8k次。原文来自11区民间整合的Mugen主程序报错汇总,同时加入了千寻网站平时收集的常见报错,源地址:http://mugenbinran.web.fc2.com/error.html以下皆为机翻,有空会慢慢修正翻译加载初始场景报错报错关键字:dojo.def 或 stage0.def原因:程序以debug模式运行且调用了debug场景解决方法:1、在mugen.cfg文件内找到[Debug]下的Sta..._mugen报错