继续上一篇内容 SQL Server 数据库基本记录(二)
数据表
数据的完整性:数据的准确性和可靠性,不准确、不一致的数据,则导致数据 失去了完整性
实体完整性
- 要求表中的所有的行唯一
UserId | UserPwd | UserName | Gender |
---|---|---|---|
bobo | 123456 | 王波 | 0 |
不能添加以下行,加粗部分表示重复
bobo | 123456 | 王波 | 0 |
- 约束方法:唯一约束、主键约束、标识列
域完整性约束
- 保证列值符合规定要求
UserId | UserPwd | UserName | Gender |
---|---|---|---|
bobo | 123456 | 王波 | 0 |
不能添加以下行,加粗部分表示密码长度小于六位
yuyu | 1236 | 王雨 | 1 |
- 约束方法:限制数据类型、检查约束、外键约束、默认值、非空约束
引用完整性约束
- 要求两表相同字段必须一致
SortId | SortName |
---|---|
1 | 手机数码 |
2 | 图书音像 |
3 | 家用电器 |
下表相同字段必须一致,不能填写主键中未存在的内容
SortId | CommodityName |
---|---|
1 | IPhone 8 |
1 | OnePlus 5 |
3 | 三门冰箱 |
下表不可添加,因为 SortId 不存在 4
SortId | CommodityName |
---|---|
4 | 电商时代 |
- 约束方法:外键约束
主外键
主键
- 表中一列或几列组合的,能够唯一标识表中的每一行
- 一个表只能有一个主键
- 多列组合当主键称为复合主键
原则:最少性和唯一性
外键
- 相对应于主键
- 一个表可以有多个外键
标识列
- 自动增长列 或 自动编号
- 本身没有具体的含义,只是用来标识不同的实体
标识列的实现方式
- 标识列用来区分不同的实体
- 定义成标识列时,需要指定 标识种子 和 标识增量,默认值都为 1
- 标识列通常也被定义为 主键
- 定义为标识列的列必须是 整型
- 标识列数据是 自动增加 的,不能手动的为标识列插入值
空值:NULL 在填入数据值时可不填 默认值:表中的某列,用户不输入数据的时候,将被自动填入
数据类型
分类 | 数据类型 | 说明 |
---|---|---|
文本数据类型 字符数据包括任意字母、符号或数字字符的组合 | char varchar nchar nvarchar text ntext | 固定长度的非 Unicode 字符数据 可变长度非 Unicode 数据 固定长度的 Unicode 数据 可变长度的 Unicode 数据 存储长文本信息 存储可变长度的长文本 |
日期和时间 | datetime | |
数字数据类型 仅包含数字,包括整数和浮点数 | int、smallint、float、real、numcric(18,0) | 整数、浮点数 |
货币类型数据 十进制货币值 | money | |
bit 数据类型 表示 是/否 的数据 | bit | 存储布尔数据类型 |
创建表
USE E_Market -- 指向当前所操作的数据库
GO -- 批处理标识
CREATE TABLE CommoditySort -- 创建名为 CommoditySort 的表
(
SortId int IDENTITY(1,1) NOT NULL, -- SortId 列,不允许空值
SortName varchar(50) NOT NULL -- SortName 列,长度 50,不允许空值
)
复制代码
约束
约束类型
- 主键约束:要求主键列不能为空以及唯一
- 非空约束:要求该列不能存在空值
- 唯一约束:要求该列的值必须唯一,允许为空,但只能出现一个空值
- 检查约束:限制某列取值的范围是否合适
- 默认约束:设计某列的默认值
- 外键约束:用于在两表之间建立关系,需要指定引用主键的时哪一列
- 主键约束与唯一约束的区别 -- 主键约束所在的列不允许有空值,唯一约束所列允许空值 -- 每个表中可以有一个主键,多个唯一键
语法
ALTER TABLE 表名
ADD CONSTRAINT 约束名 约束类型_约束列
E.g:
USE E_Market
GO
-- 为用户表UserInfo添加约束
ALTER TABLE UserInfo
ADD CONSTRAINT PK_UserId PRIMARY KEY(UserId), -- 主键约束
CONSTRAINT CK_UserPwd CHECK(LEN(UserPwd)>=6), -- 唯一约束
CONSTRAINT CK_Gender CHECK(Gender=0 OR Gender=1), -- 唯一约束
CONSTRAINT DF_GENDER DEFAULT(0) FOR Gender, -- 默认约束
GO
复制代码
适用于表中没有任何数据时,若有数据,会报错
约束取名规则
推荐采用:约束类型_约束列
约束名 | 例如 |
---|---|
主键 (Primary Key) 约束 | PK_UserId |
唯一 (Unique Key) 约束 | UK_UserCardId |
默认 (Default Key) 约束 | DF_UserPasspwd |
检查 (Check Key) 约束 | CK_Gender |
外键 (Foreign Key) 约束 | FK_SortId |
语法_已存在数据
ALTER TABLE 表名 WITH NOCHECK
ADD CONSTRAINT 约束名 约束类型 具体的约束说明
E.g:
-- 向已存在数据的表中添加约束
ALTER TABLE Employee WITH NOCHECK
ADD CONSTRAINT CK_EmployeeId CHECK(LEN(EmployeeId)=18)
GO
复制代码
对表中现有的数据不做检查,只对添加约束后再录入的数据进行检查
删除约束
ALTER TABLE 表名
DROP CONSTRAINT 约束名
E.g:
-- 删除检查约束
ALTER TABLE Employee
DROP CONSTRAINT CK_EmployeeId
GO
复制代码
- 有时候表之间存在关系,删除约束时提示存在关系,这时需要先删除主键
-- 先删除主键
ALTER TABLE Employee
DROP CONSTRAINT PK_Employee
GO
-- 再删除检查约束
ALTER TABLE Employee
DROP CONSTRAINT CK_EmployeeId
GO
复制代码
数据库关系图
- 对特定的数据库表进行可视化管理与分析
- 一个数据库中可以创建多个数据库关系图
删除数据表
DROP TABLE 表名
E.g:
IF EXISTS (SELECT * FROM sysobjects WHERE name='CommodityInfo') -- 检测要删除的表是否存在
DROP TABLE CommodityInfo
复制代码