[SQL]基本表的定义及其完整性约束
在使用数据库时,绝大多数时间都是在使用基本表。
SQL Server数据类型

截图来源: https://www.w3school.com.cn/sql/sql_datatypes.asp
创建基本表
基本格式如下:
create table <表名>
(
<列名1> <数据类型> [<列级完整性约束条件>],
……
<列名n> <数据类型> [<列级完整性约束条件>]
[, <表级完整性约束条件>]
)
如果完整性约束涉及到多个属性列,则必须定义在表级上,否则可以定义在列级或表级。
如下创建一个Persons基本表:
use test -- 在该数据库中创建基本表
go
create table Persons
(
Id_P int primary key, -- Id_P为主键
LastName nvarchar(20),
FirstName nvarchar(20),
Address nvarchar(50),
City nvarchar(10)
)
go
完整性约束
完整性约束的用途是限制输入到基本表中的值的范围,SQL的完整性约束可分为列级完整性约束和表级完整性约束:
- 列级完整性约束:针对关系属性值的限定条件,只能应用在一列上
- 表级完整性约束:涉及关系中的多个属性的限制条件,可以应用在一个基本表中的多个列上。
如果完整性约束涉及到多个属性列,则必须定义在表级上,否则可以定义在列级或表级。当创建完整性约束之后,它作为基本表定义的一部分,存入数据字典中。
primary key约束
主键(primary key)约束是实体完整性约束,primary key用于定义主键,它保证主键的唯一性与非空性。一个基本表的主键由一列或者几列构成,可以定义在列级或者表级上,但是不能在两个级别上进行定义。
定义主键约束的方法如下:
primary key之间写在列名及其数据类型之后。例如:
create table test
(
col_name int primary key,
……
)
按照语法在相应的列名及其数据类型后单独列出:
constraint <约束名> primary key
约束名就是主键的名字。例如:
create table test
(
col_name int constraint PK_name primary key,
……
)
在create table语句中定义完所有列之后定义表级主键约束:
primary key (列名1, 列名2, ……)
或
constraint PK_name primary key (列名1, 列名2, ……)
例如:
create table test
(
col_name1 int,
col_name2 nvarchar(10),
……
constraint PK_name primary key (col_name1, col_name2)
)
foreign key约束
外键(foreign key)约束也称为参照表约束,用于定义参照完整性,即用来维护两个基本表之间的一致性关系。外键的建立主要是通过将一个基本表的主键(或者unique唯一性约束)所在的列包含在另一个表中,这些列就是另一个表的外键。
例如,因为销售订单和销售人员之间存在一种逻辑关系,所以 Sales.SalesOrderHeader 表含有一个指向 Sales.SalesPerson 表的外键链接。 SalesOrderHeader 表中的 SalesPersonID 列与 SalesPerson 表中的主键列相对应。 SalesOrderHeader 表中的 SalesPersonID 列是指向 SalesPerson 表的外键。 通过创建此外键关系,如果 SalesPerson 表的主键中不存在 SalesPersonID 的值,则 SalesPersonID 的值将无法插入到 SalesOrderHeader 表。
外键的作用不只是对输入自身表格的数据进行限制,同时也限制了对主键所在基本表的数据进行修改。主键所在的数据被另一张表的外键所引用时,用户将无法对主键中的数据进行修改或者删除,除非事先删除或修改引用的数据。
foreign key约束定义外键的方法如下:
如果外键只有一列,可以在它的列名和类型后面直接用references说明它参照了某个基本表的某些列(必须为主键):
references <表名> (<列名>)
在属性列表后面增加一个或几个外键说明,其语法格式为:
foreign key (<列名>) references <表名> (<列名>)
其中,第一个列名是外键,第二个列名是被参照基本表中的列名。
在相应的列名及其类型后单独列出并指定约束名,语法格式为:
constraint <约束名> foreign key (<列名>) references <表名> (<列名>)
unique约束
unique约束是唯一性约束,主要用来确保不受primary key约束的列上的数据的唯一性,两者的区别主要表现如下:
- unique约束主要用在非主键的一列或者多列上要求数据唯一的情况。
- unique约束允许该列上存在NULL值,而主键不允许。
- 一个表可设置多个unique约束,但是只能有一个主键约束。
unique约束可以在列级和表级上设置,但是要在多个列上设置unique约束必须设置表级约束。
定义unique约束的方法:
unique约束直接写在列名和数据类型之后
按照语法在相应的列名及其类型后单独列出:
constraint <约束名> unique
表级unique约束:
constraint <约束名> unique (<列名1> [, <列名2>, <列名2>,……])
check约束
check约束时检查约束,它通过检查输入表列的数据的值来维护值域的完整性,它依次检查每一个要进入数据库的数据,只有符合条件的数据才允许通过。check约束通过对一个逻辑表达式的结果进行判断来对数据进行检查。
default约束
default约束用于向列中插入默认值,如果没有规定其他的值,则添加默认值到所有新记录中。
not null或null约束
not null约束不允许列值为空,null约束允许列值为空。
create table 图书
(
图书号 varchar(15),
图书名称 varchar(30),
主编 varchar(30) not null,
出版社 varchar(15) default '清华大学出版社'
单价 float,
constraint CH_dj check (单价>=0 and 单价<=1000)
)
[SQL]基本表的定义及其完整性约束的更多相关文章
- SQL Server 表的管理_关于完整性约束的详解(案例代码)
SQL Server 表的管理之_关于完整性约束的详解 一.概述: ●约束是SQL Server提供的自动保持数据库完整性的一种方法, 它通过限制字段中数据.记录中数据和表之间的数据来保证数据的完整性 ...
- SQL 创建表
SQL 创建表是通过SQL CREATE TABLE 语句来实现,该语句是DDL SQL语句.CREATE TABLE语句用于创建用于存储数据的表.在创建表时,可以为列定义主键.惟一键和外键等完整性约 ...
- SQL Server 表变量和临时表的区别
SQL Server 表变量和临时表的区别 一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯 ...
- SQL Server表分区【转】
转自:http://www.cnblogs.com/knowledgesea/p/3696912.html SQL Server表分区 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在 ...
- SQL语言学习-数据定义语言
Sql语言至今已经有6个版本.SQL查询语言包括了所有对数据的操作命令,这些操作可分为四类:数据定义语言(DDL).数据操纵语言(DML).数据控制语言(DCL)和嵌入式SQL语言. 数据定义语言(D ...
- SQL Server表分区详解
原文:SQL Server表分区详解 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆 ...
- [转]SQL Server 表变量和临时表的区别
一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约 ...
- 数据库概论_3标准化的SQL语言_ 数据定义
Student: Course: SC: 1.数据库的定义.删除 1.1数据库的定义(创建) CREATE DATABASE student; 1.2数据库的删除 DROP DATABASE stud ...
- oracle SQL多表查询
SQL多表查询 1.集合理论 1.1 什么是集合 具有某种特定性质的事物的总体. 集合的特性:无序性.互异性.确定性. 一个集合可以小到从一个表中取出一行中的一列. 1 ro ...
随机推荐
- 自然语言处理(NLP)——简介
自然语言处理(NLP Natural Language Processing)是一种专业分析人类语言的人工智能.就是在机器语⾔和⼈类语言之间沟通的桥梁,以实现人机交流的目的. 在人工智能出现之前,机器 ...
- 使用RSA和DES保护的Socket通信
基本要求:将DES加密算法应用于网络通信,使用RSA算法自动分配密钥,设计好界面,可验证自动生成的密钥和加解密正确的结果. 具体实现要求:客户端和服务器建立连接后,客户端生成一个随机DES密钥;服务器 ...
- sonarqube 8.9版本配置发信邮箱
admin登陆sonarqube系统 安装部署sonarqube 请参见我的安装博文: https://www.cnblogs.com/cndevops/p/14934434.html 配置邮箱 配置 ...
- SpringBoot拦截器及源码分析
1.拦截器是什么 java里的拦截器(Interceptor)是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止 ...
- redis阻塞原因以及处理方案
来源:https://blog.csdn.net/francis123580/article/details/82500700 Redis是单线程架构,在高并发的场景下,如果出现阻塞,会有严重后果,以 ...
- 第三章 深入理解python语言
计算机技术的演进过程 1946-1981年 计算机系统结构时代(35年) 解决计算机能力的问题 1981-2008年 网络和视窗时代(27年) 解决交互问题 2008-2016年 复杂信息系统时代(8 ...
- 安装PyTorch后,又安装TensorFlow,CUDA相关问题思考
下面的话是我的观察和思考,请多多批评. TensorFlow 要用 CUDA.CUDA toolkit.CUDNN,看好版本的对应关系再安装,磨刀不误砍柴工. 1)NVIDIA Panel 里显示的N ...
- JS中 var,let与const的区别
1.在ES6(ES2015)出现之前,JavaScript中声明变量就只有通过 var 关键字,函数声明是通过 function 关键字,而在ES6之后,声明的方式有 var . let . cons ...
- Odoo ORM研究1 - BaseModel中的类属性的作用
概述 我们在写odoo项目的时候,经常继承model.Model来创建我们自己的ORM映射关系表. AbstractModel = BaseModel # 源码 class Model(Abstrac ...
- 给App加上音频编辑功能,让你的用户Show起来
如今短视频当道,BGM无处不在,用户在每个能秀的地方都想要加上个性表达的音频.作为一个开发者,需不断探索和迎合用户的行为喜好,音频编辑功能成为用户在编辑个人信息.内容创作.生活分享等场景下的必需品. ...