SQL的主键和外键

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.lengthFROM syscolumns,systypesWHERE syscolumns.xusertype = systypes.xusertypeAND syscolumns.id = OBJECT_ID('Student')
复制代码

 

 

-- 单独查询表递增字段

SELECT [name] FROM syscolumns WHEREid = 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 columnNameFROM sysobjects INNER JOIN sysconstraintsON sysobjects.xtype in('C', 'F', 'PK', 'UQ', 'D')AND sysobjects.id = sysconstraints.constidLEFT OUTER JOIN syscolumns ON sysconstraints.id = syscolumns.idWHERE OBJECT_NAME(sysobjects.parent_obj)='StuResults'

转载于:https://www.cnblogs.com/stockcrm/p/8597913.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win 11bitlocker恢复密匙一般情况的解决方式(这里指的是你现在使用的微软账户一直没有变更过)

本来没有打算写这一篇解决帖子的,但是最近好多微博的友友都在私我询问解决方法,孩子虽然很热心,但是真的回复不过来了,打字太累了,这里给大家简单指个路,希望能够对大家有所帮助。 当时出现这个问题的时候…

软件测试之黑盒测试-边界值分析法(理论白话学习/期中期末备考)

这里简单进行一下知识体系的梳理。 文章目录前言一、边界值分析是什么?二、因果图1.分析规格说明中给出的原因,结果和是否可能存在中间态。2.标约束,画图三、画判定表并画出对应的测试用例表。总结前言 主要从三个方面谈一下简单应用 边界值…

window下搭建Python3.7+selenium3.1.1+pycharm环境

1.安装Python3.7 1.1 下载 Python并安装 Python3.5 (勾选上 Add Python3.7 to PATH) 点击 Install Now,安装完成后将python路径加入环境变量Path 如D:\python35\Python35;D:\python35\Python35\Scripts; 1.2 安装完成之后,winr…

软件测试之单元测试之Junit测试使用前准备

Junit测试只能说是算的上软件测试这门课中首次出现需要实操进行测试的工具了。 可以理解为前面的黑盒测试,白盒测试是为了理解一种测试思想,根据测试思想能够进行设计测试样例,到了Junit单元测试这里,就成了利用工具进行具体的测…

解释为脑瘫的那张图_Python GIL全局解释器锁详解(深度剖析)

通过前面的学习,我们了解了 Pyton 并发编程的特性以及什么是多线程编程。其实除此之外,Python 多线程还有一个很重要的知识点,就是本节要讲的 GIL。GIL,中文译为全局解释器锁。在讲解 GIL 之前,首先通过一个例子来直观…

SPOJ3276 D-query

题意&#xff1a;n个数 a1...an&#xff0c;q组询问&#xff0c;每组询问给定 l&#xff0c;r&#xff0c;输出 [ l, r ] 有多少不同的数 ( n ≤30000, q ≤200000, ai ≤ 106 ) 离线 树状数组维护 1 #include<bits/stdc.h>2 3 using namespace std;4 5 const int MAXN…

关于string型的处理——pta L1常用

1.关于带空格字符串函数的输入 a.getline(cin,str); b.getline(cin,str,c);(c为字符。) #include<bits/stdc.h> using namespace std; int main() {string str1,str2;getline(cin,str1); //输入带空格的字符串&#xff0c;当输入空格的时候终止 getline(cin…

电路板上的插头怎么拔下来_空调维修排查电路板内外原因

点击链接&#xff1a;空调变频板维修在线课程来了空调维修资料库重大更新&#xff0c;正在上传中&#xff0c;点击马上拥有排查电路板内外原因熟悉电路结构&#xff0c;先分清控制板的内外电路&#xff0c;外部检测、外部控制等&#xff0c;分清故障产生是内因还是外因——确定…

在比赛中一些对数和数组的操作的应用(持续更新)

1.整形数组的排序-sort函数&#xff08;在比赛中如果比赛不卡时间的话可以节省不少时间&#xff09; sort(na,nb);(n为你想要进行排序的整形数组)&#xff1b; #include<bits/stdc.h> using namespace std; int main() {int num[10]{1,23,232,213,112,123,342,42,121,12…

软件测试知识体系结构整理(一)(个人为备战期中期末理论考试所总结,如需要系统学习关于软件测试的知识,请参考其他博主)

系列文章目录 第一章 软件测试基本概念 文章目录系列文章目录一、软件测试基本概念1.软件缺陷2.软件缺陷类型3.软件缺陷等级4.关于对软件测试的一般误区5.软件测试环境二、白盒测试1.白盒测试的概念与优缺点理解2.逻辑测试3.基本路径测试三.黑盒测试1.等价类测试2.边界值分析法…

算法训练 6-1 递归求二项式系数值

算法训练 6-1 递归求二项式系数值 问题描述样例输入一个满足题目要求的输入范例。3 10样例输出与上面的样例输入对应的输出。数据规模和约定输入数据中每一个数的范围。例&#xff1a;结果在int表示时不会溢出。 import java.util.Scanner;public class Main {public static v…

印象笔记mac版 同步问题_印象笔记表示 今年将大幅提升产品体验

【手机中国新闻】尽管去年取得了一些成绩&#xff0c;但印象笔记依旧在业务泥潭中苦苦挣扎&#xff0c;该公司一度裁员15%并承受了一些高管的离职。Ian Small去年10月起取代2015年上任的Chris O Neill成为印象笔记现任CEO&#xff0c;相较于一些相关的老生常谈的创新&#xff0…

函数基本语法及特性

我先复制了下面一段&#xff0c;挺有意思的。 背景提要 现在老板让你写一个监控程序&#xff0c;监控服务器的系统状况&#xff0c;当cpu&#xff3c;memory&#xff3c;disk等指标的使用量超过阀值时即发邮件报警&#xff0c;你掏空了所有的知识量&#xff0c;写出了以下代码 …

将一个项目发布到Tomcat上并进行运行

1.下载任意版本的Tomcat&#xff0c;我这里是9的版本&#xff0c;应该是当前我认为比较好用的一个版本了&#xff0c;有需要的话可以到公众号自取。 微信公众号搜索“是短短吖” 后台回复“Tomcat”即可。 2.在webapp下部署一个项目Test&#xff08;名字自选&#xff0c;英文…

利用在Tomcat上部署servlet程序(手动布置加强关于servlet知识的理解,当前的idea是可以实现自动部署的)

一.手动部署 1.在idea里简单的建立一个测试的项目&#xff0c;创建一个简单的java文件&#xff0c;创建一个简单的类&#xff0c;进行继承HttpServlet&#xff0c;我这里以TT为例。&#xff08;PS:为避免后续麻烦&#xff0c;代码会最后给出全部&#xff0c;理解过程即可&…

Xcode9的xib只支持iOS7.0及以上版本

Xcode升级到9以后&#xff0c;对xib的最低编译版本有了限制&#xff0c;以前未指定版本的xib会报错&#xff0c;如下 遇到这个情况&#xff0c;根据错误提示很明显提示的是ib文件支持的最低版本是iOS7&#xff0c;所以我就将该xib的版本设为iOS7.0&#xff0c;如下 未指定版本的…

UI设计PS初学入门知识总结——新建的理论知识

1.一般设计的类图分类 2.新建之尺寸&#xff08;宽度&#xff0c;高度&#xff09; 分为两种&#xff0c;一种是以像素为单位&#xff0c;一种是为真实长度为单位。 一类图一般以像素为单位&#xff0c;二类图必须以真实长度为单位。 宽度和高度的细节因素根据实际需求去做&a…

20172329 2017-2018-2 《程序设计与数据结构》实验一报告

20172329 2017-2018-2 《程序设计与数据结构》实验一报告 课程&#xff1a;《程序设计与数据结构》 班级&#xff1a; 1723 姓名&#xff1a; 王文彬 学号&#xff1a;20172329 实验教师&#xff1a;王志强 实验日期&#xff1a;2018年3月21日 必修/选修&#xff1a; 必修 1.实…

VS集成Qt开发入门(简易时间显示)

VS集成Qt开发入门&#xff08;简易时间显示&#xff09;软件开发入门开发环境简单时间显示&#xff08;LcdNumber&#xff09;ui界面设计&#xff08;clock.ui&#xff09;工程文件&#xff08;clock.h&#xff0c;clock.cpp&#xff09;头文件clock.h&#xff1a;源文件clock.…

ps 毛发 边缘_不会抠图怎么办?PS画笔绘制毛发技巧,抠图流程解析

前两期我们讲了一些简单的抠像方法。第一次我们知道了如何在抠像的同时保留人物投影。第二次我们知道了如何利用背景橡皮擦工具进行抠像。以上是一些稍微简单一些的抠图方法&#xff0c;人人都可以轻松办到。今天讲如何利用PS画笔绘制毛发。今天的知识稍微需要点耐心。如何把下…