环境信息:
OS:Windows
Software:SQL Server、 Microsoft SQL Server Management Studio
类型:DDL
事件:数据表详解
文档:SQL Server2016从入门到实战
1、数据表概述
数据表是数据库的基本对象,是用户实际存放数据的结构,每个数据表都由列和行构成
数据表中列又都称为一个字段,列标题为字段名,每个字段都由相应的属性(数据类型、约束等)
数据表中行又都称为一条记录,一条记录由多个字段的描述信息组成
如下为一张表
2、数据类型
日期型
数值型
整型:
int :4个字节大小,每个字节8位,则4*8=32,其中一位表示正负符号,则实际存储范围为:-2^31~2 ^31-1 内的整数
smallint:2 个字节大小 ,则2*8=16,则实际存储范围为:-2^15~2 ^ 15 -1 内的整数
tinyint : 1个字节大小, 则1*8=8,则实际存储范围为:0~255 内的整数
bigint : 8个字节大小 ,则8*8=32,则实际存储范围为:-2^63~2 ^ 63 -1 内的整数
浮点型:
real : 4个字节大小,精确到小数点第7位,则实际存储范围为:-3.4E+38~ 3.40E+38
float :近似数类型,即在期范围内不是所有数值都能精确表示, 则实际存储范围为:-1.79 E+308~ 1.79 E+308
decimal :存储-10 ^38~2 ^ 38 -1范围内的固定精度的数值数据,必须指定范围和精度(范围是小数点左右的总位数,精度是小数点右边的位数,如decimal(5 2)表示整数3位,小数2位)
字符型
char :存储指定长度的定长非同一编码型的数据,此类型必须指定长度,默认为存储一个字符,最多8000个字符,适用于用户知道数据长度,如11位手机号 char(11)
varchar : 存储指定长度的变长 非同一编码型的数据,此类型必须指定最大长度
nchar : 存储指定长度的 定长 同一编码型的 数据,此类型必须指定最大长度,能存储4000种字符
nvarchar : 存储指定长度的变长 非同一编码型的 数据,此类型必须指定最大长度 ,能存储4000种字符
PS:字符编码此处不做说明,自行百度了解
日期、时间型
date :存储日期,3个字节存储空间,格式为:YYYY-MM-DD
time :存储时间 ,5个字节存储空间,格式为:HH:MM:SS[.NNNNNNN]
datetime :存储日期时间,8个字节存储空间,范围为1753年1月1日-9999年12月31日内的所有日期和时间,精确到三百分之一秒活3.33毫秒
datetime2 :存储日期时间,6~8个字节存储空间,范围为0001年1月1日-9999年12月31日内的所有日期和时间,精确到100纳秒
smalldatetime :存储日期时间,4个字节存储空间,范围为1900年1月1日-2079年6月6日内的所有日期和时间,精确到三百分之一秒活3.33毫秒
PS:
YYYY-MM-DD
YYYY:年份,0001~9999
MM:月份,01 ~12
DD:某日,01 ~31
HH:MM:SS[.NNNNNNN]
HH :小时,0~23
MM :分钟,0~59
SS :秒, 0~59
N : 秒的小数,0~9 999 999
文本型
text:存储大文本数据,容量为2 ^31 -1(2147483674)字节,实际和硬盘大小有关
ntext :存储大文本数据 ,unicode标准字符集 ,容量为2 ^30 -1(1073741823)字节,实际和硬盘大小有关
image :存储大量二进制数据,如图形等 ,容量为2 ^31 -1(2147483674)字节,实际和硬盘大小有关
货币数据类型
money:存储钱的, 8个字节存储空间,范围:-922337203685477.5808~ 922337203685477.5807
smallmoney :存储钱的, 8个字节存储空间, 范围:-214748.3648~ -214748.3647
位数据类型
bit :用于逻辑判断, TRUE 1 ,FALSE 0, 范围:0或1
二进制数据类型
BINARY(N) :固长为N的二进制数据, 范围:N,取值范围1-8000,二进制数据输入时需要在前面加上0X,如0XBB4 代表BB4
VARBINARY :长度可变, 范围:8000字节内
其他
ROWVERSION,内部序列数,每个表只能含有一个 ROWVERSION存在,表示该表的记录是否被修改过的列
create table t1(id int primary key ,change_col rowversion);
TIMESTAMP,时间戳数据类型,类似ROWVERSION,插入或更改含有该列的表的记录时,对应的值TIMESTAMP会被更新【可能不再被使用,建议不要用】
create table t1(id int primary key ,timestamp);
UNIQUEIDENTIFIER ,唯一标识符GUID,主键数据类型,由硬件地址、CPU标识、时钟频率组成的随即数据,理论上全球唯一、 GUID可被修改、缺点检索慢、阅读性差
CURSOR ,游标数据类型、存放数据库中选中行和列、只是一个物理地址的引用、不含索引,可用于建立数据集
SQL_VARIANT ,用于存储各种类型数据(不包括text、ntext、image、timestamp、sql_variant)
自定义数据类型:基本不会用到,自行研究,不多做说明
3、表管理
管理器管理(图形界面点点点)
建表
在数据库testdb内建一张表
如下右击 表 单击 新建 内的 表
如下出现 列名、数据类型、允许 Null值
根据需要依次填写
单击保存即可
刷新才能看到这个表,我也不知道为啥,很尴尬
也可T-SQL 创建,但是完了还得刷新才会出现
USE [testdb] GO CREATE TABLE [dbo].[student2]( [id] [char](10) NOT NULL, [name] [varchar](50) NOT NULL, [gender] [char](2) NULL ) ON [PRIMARY] GO
表加字段
单击 设计
如下添加报错,失败了
百度了解到是因为这个需要取消阻止更改表结构,默认是阻止更改现有结构的
再进行之前失败的操作,成功
修改数据类型
同样的操作,在需要的字段进行数据类型的修改即可
保存此修改后,需要刷新表信息,列类型才会变化
修改数据类型对生产库来说是个危险的操作,如果修改的类型和原来的存储数据类型不匹配可能会出现数据丢失等问题,慎重操作
表名修改 student 改为 student_info
生产慎重操作,应确保当前无用户使用操作对象
删除数据表
删除前确保 当前无用户使用操作对象,并且进行了备份
点击确定后,表消失
4、约束
顾名思义,就是对字段做另外的限制操作,一般数据表都会有的约束为主键约束、唯一性约束、外键约束等,主要是对用户数据的合法性和完整性的检查
主键约束(primary key constraint)
定义某字段为数据表的主要关键字,主键是表中唯一性标识,每个表最多设置一个主键约束,且该列不可为空,不能出现重复值,可多列联合为主键约束,多列中的某列可以有重复值,但是多列一起不能出现重复值
创建主键约束
对 testdb库的student_info表的id字段设置为主键约束
如下右击 id列单击 设置主键即可,记得点击保存使其生效
唯一约束 (unique constraint)
确保字段内值的唯一性,
unique约束允许出现空值,因为空不等于空,可以多个,唯一约束的字段会出现唯一索引,默认是非聚集(簇)索引
创建 唯一约束
对 testdb库的student_info表的name字段设置为 唯一约束
完成后点击关闭、然后保存点开 键就能看到新建的相关唯一约束
检查约束 (check constraint)
自定义的约束类型,对数据设置某些检查条件,如age字段限定年龄在18~70!
列约束只能与字段有关,可对多个列进行检查约束设置,create table 只能对每个字段设置一个检查约束,多个字段进行检查约束为表级约束,检查约束会在insert、update 时进行数据检查,检查约束设置不能包含子查询
创建检查约束
先增加一个age列,此处不再显示操作过程
点击关闭 保存 然后刷新表可看到此检查约束被创建成功
默认约束 (default constraint)
默认约束即为给字段设置一个默认值,如果插入记录时该字段默认值,则使用设置的默认值作为记录!
每个字段最多只能有一个默认约束,默认约束设置的值大于字段允许的长度,多出的部分会被截取掉,不能加入带有identity 、 timestamp的属性,自定义数据类型含默认值则不允许使用此约束
外键约束 (foreigm key constraint)
子表引用父表的主键作为自己的外键来保证表间数据的关系“始终完整”
保证数据的完整性和一致性、级联操作方便、将数据完整性判断托付给了数据库完成,减少了程序的代码量
外键约束不支持自动建索引,需手动创建;表最多可同时使用31个外键约束,临时表不能建立外键。主外键数据类型需要保持一致
ps: 不建议设置外键来控制数据完整性和一致性,应该用程序来控制!
验证约束
插入一个合法数据成功
重复插入该记录报错,主键冲突
主键改为2,其他不变插入记录报错,唯一约束冲突
主键改为2,sun改为sun2其他不变 插入成功
主键改为3,sun改为sun3,18改为17 插入失败,改为71也失败
默认约束和外键约束不再做说明验证