七、SQL Server数据表管理

1 表的基本概念

1.1 数据完整性

  • 数据的准确性、可靠性
  • 不准确,不一致的数据,则导致数据“失去了完整性”
  • 例如:一张表中有一列UserPwd用于存放用户密码,规定的是密码长度是大于等于6,如果输入的数据长度小于6,则该数据就会“失去了完整性”。

1.2 实体完整性约束

  • 要求表中所有的行唯一
  • 约束方法:唯一约束,主键约束,标识列

1.3 域完整性约束

  • 保证列值符合规定要求
  • 约束方法:限制数据类型、检查约束、外键约束、默认值、非空约束

1.4 引用完整性约束

  • 要求两表相同字段必须一致
  • 约束方法:外键约束

1.5 主键

  • 表中一列或者几列组合的,能够唯一的表示表中的每一行
  • 一个表中只能有一个主键
  • 多列组合当主键称为复合主键
  • 原则:最少性和唯一性

1.6 外键

  • 相对应于主键而言
  • 一个表可以有多个外键

1.7标识列

  • “自定增长列”或“自动编号”
  • 本身没有具体的含义,只是用来标识不同的实体

标识列的实现方式
1、标识列用来区分不同的实体
2、定义成标识列时,需要指定“表示种子”和标识增量
,默认值都为1。
3、标识列通常也被定义为主键
4、定义为标识列的列必须是整型
5、标识列的数据是自动增加的,不能手动的为标识列插入值

空值:NULL在填入数据值可以不填
默认值:表中的某列,用户不输入数据的时候,其值自动被填入

2 表的数据类型

在这里插入图片描述

2.1 文本数据类型

char 和 varchar
汉字占2个字节,英文、数字或字符都占1个字节
例如,性别字段,存储 “男” 或 “女”
数据类型为:char(2) 或者 varchar(2)

nchar 和 nvarchar
无论是汉字还是英文,数字或字符都占1个字节
例如,性别字段,存储 “男” 或 “女”
数据类型为:nchar(1) 或者 nvarchar(1)

固定长度 和 非固定长度
1、例如,身份证号 是18位固定长度,数据类型为:char(18) 或 nchar(18)
2、例如,住址是非固定长度,数据类型为:varchar(255) 或 nvarchar(255)
3、如果住址中存在汉字、数字,推荐使用nvarchar(255),占字节数一致
4、如果存储小说或者新闻,数据类型使用 text 或 ntext

2.2 日期和时间数据类型

请添加图片描述

2.3 数字数据类型

2.4 货币数据类型

在这里插入图片描述

2.5 bit数据类型

请添加图片描述

3 创建表

3.1 创建表(使用视图)

分别创建表UserInfo 和 OrderInfo

请添加图片描述
请添加图片描述

3.2 创建表(使用SQL语句)

语法

CREATE TABLE <表名>(

<列名1> <数据类型> <属性>,
<列名2> <数据类型> <属性>,
...

)
--创建表 CommoditySort
USE E_Market       --指向当前所操作的数据库
GO

CREATE TABLE CommoditySort
(
	SortId int IDENTITY(1,1) NOT NULL,   --类别编号
	SortName varchar(50) NOT NULL        --类别名称
)
GO
--创建表 CommodityInfo商品信息表
USE E_Market       --指向当前所操作的数据库
GO

CREATE TABLE CommodityInfo
(
	CommodityId int IDENTITY(1,1) NOT NULL,   --商品编号
	SortId int NOT NULL,                      --类别编号,外键
	CommodityName varchar(50) NOT NULL,       --商品名称
	Picture image ,                           --商品图片
	InPrice float NOT NULL,                   --商品进价
	OutPrice float NOT NULL,                  --商品售价
	Amount int NOT NULL                       --商品库存
)
GO

SQL语句执行成功之后,刷新E_Market数据库中的表,可以看到表创建成功。
请添加图片描述
请添加图片描述

注意:
如果创建的表已经存在,再次执行创建语句,就会报错。
所以,创建表之前,如果表已存在,则先删除表。

--创建表 CommoditySort
USE E_Market       --指向当前所操作的数据库
GO

--如果表CommoditySort已存在,则先删除
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'CommoditySort')
DROP TABLE CommoditySort
GO

CREATE TABLE CommoditySort
(
	SortId int IDENTITY(1,1) NOT NULL,   --类别编号
	SortName varchar(50) NOT NULL        --类别名称
)
GO

3.2 添加表约束(表中没有数据)

3.2.1 约束的类型

  1. 主键约束: 要求主键列不能为空,要求主键列唯非空约束:要求该列不能存在空值
  2. 唯一约束: 要求该列的值必须是唯一的,允许为空,但
    只能出一同个空值
  3. 检查约束: 限制某列取值的范围是否合适默认约束:设计某列的默认值
  4. 外键约束: 用于在两表之间建立关系,需要指定引用主
    表是哪一列

3.2.2 主键约束与唯一约束的区别

  1. 主键约束所在的列不允许有空值,唯一约束所在的列允许空值
  2. 每个表中可以有一个主健,多个唯一键

3.2.3 添加约束(使用视图)

(1)设置表的“主键约束”

请添加图片描述
请添加图片描述
请添加图片描述
(2)设置表的“唯一键约束”
请添加图片描述
请添加图片描述
请添加图片描述
(3)设置表的“检查约束”
请添加图片描述
请添加图片描述
(4)设置表的“外键约束”
请添加图片描述
请添加图片描述

3.2.4 添加约束(使用SQL语句)

语法
ALTER TABLE <表名> 
	ADD CONSTRAINT <约束名1> <约束类型> <具体的约束说明>,
	    CONSTRAINT <约束名2> <约束类型> <具体的约束说明>,
	    ...
<约束名>的取名规则推荐采用:约束类型_约束列
1、主键(Primary Key)约束:如 PK_UserId
2、唯一(Unique Key)约束:如 UQ_UserCardId
3、默认(Default Key)约束:如 DF_UserPasspwd
4、检查(Check Key)约束:如 CH_Gender
5、外键(Foreign Key)约束:如 FK_SortId

(1)案例1

举例:给表UserInfo添加约束
1、设置列UserId为主键
2、设置列UserPwd长度大于等于6
3、设置列Gender性别只能取值0或1,默认为0
4、设置列Email必须包含“@”字符


USE E_Market        --指向当前操作的数据库
GO

--为表UserInfo添加约束
ALTER TABLE UserInfo 
ADD CONSTRAINT PK_UserId PRIMARY KEY(UserId),            --设置UserId为主键
    CONSTRAINT CK_UserPwd CHECK(LEN(UserPwd)>=6),        --设置UserPwd长度大于等于6
    CONSTRAINT CK_Gender CHECK(Gender = 0 OR Gender = 1),--设置Gender性别取值为0或1
    CONSTRAINT DF_Gender DEFAULT(0) FOR Gender,          --设置Gender性别默认为0
    CONSTRAINT CK_Email CHECK(Email LIKE '%@%')          --设置Email必须包含@
GO

请添加图片描述
(2)案例2

举例:给表OrderInfo添加约束
1、设置列OrderId为主键
2、设置列UserId、Commodity为外键(前提是UserId、Commodity已分别为表UserInfo、表Commodity的主键)
3、设置列PayWay默认值为“网上银行”
4、设置列Confirm只能取值0或1,默认取值0
5、设置列SendGoods只能取值0或1,默认取值0

注意:
【1】外键约束:外键的类型、长度必须与引用的主键列的类型、长度完全一致。
【2】外键约束:引用的表中必须有主键列

--为表OrderInfo添加约束
ALTER TABLE OrderInfo
ADD CONSTRAINT PK_OrderId PRIMARY KEY(OrderId),
    CONSTRAINT FK_UserId FOREIGN KEY(UserId) REFERENCES UserInfo(UserId),
    CONSTRAINT FK_CommodityId FOREIGN KEY(CommodityId) REFERENCES CommodityInfo(CommodityId),
    CONSTRAINT DF_PayWay DEFAULT('网上银行') FOR PayWay,
    CONSTRAINT CK_Confirm CHECK(Confirm = 0 OR Confirm = 1),
    CONSTRAINT DF_Confirm DEFAULT(0) FOR Confirm,
    CONSTRAINT CK_SendGoods CHECK(SendGoods = 0 OR SendGoods = 1),
    CONSTRAINT DF_SendGoods DEFAULT(0) FOR SendGoods
GO

请添加图片描述

3.3 已有数据的表添加约束(只能使用SQL语句)

语法
ALTER TABLE <表名> WITH NOCHECK
  ADD CONSTRAINT <约束名> <约束类型> <具体的约束说明>

对表中现有的数据不做检查,
只对添加约束之后的再录入的数据进行检查

举例:
对表Employee中的列EmployeeId设置长度必须等于18的约束。
请添加图片描述

USE DemoDB    --指向当前操作的数据库DemoDB
GO

--向已存在数据的表Employee中添加约束
ALTER TABLE Employ WITH NOCHECK
ADD CONSTRAINT CK_EmployeeId CHECK(LEN(EmployeeId)=18)
GO

设置成功之后,可以看到对多了新的约束。请添加图片描述
此时再添加的新的数据时,如果EmployeeId长度小于18就会报错。
请添加图片描述

3.4 删除约束

3.4.1 使用视图

比较简单,就不细说了。下面以“删除主键”为例。

请添加图片描述

3.4.2 使用SQL语句

语法
ALTER TABLE <表明>
   DROP CONSTRAINT <约束名>

举例:删除数据库DemoDB中表Depart的主键

请添加图片描述

USE DemoDB     --指向当前操作的数据库
GO

--删除主键
ALTER TABLE Depart
DROP CONSTRAINT PK_Depart
GO

SQL语句执行成功之后,可以看到表Depart中已经没有了主键。
请添加图片描述

3.5 数据库关系图

数据库关系图
1、对特定的数据库表进行可视化管理与分析
2、一个数据库可以创建多个数据库关系图

3.4.1 创建数据库关系图

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

3.4.2 说明

数据库关系图中
1、清楚的查看表之间的引用关系
2、建立引用关系,从主表的主键向子表的引用键拖动
3、与在设计状态建立主外键关系的区别

  • 在设计状态下,建立主外键关系是从子表向主表建关系
  • 在数据库关系图下,建立主外键关系是从主表向子表建关系

3.4.3 问题

请添加图片描述
解决:
使用系统存储过程改变数据库所有者为当前登录账号

当前登陆账号为sa
EXEC sp_changedbowner sa

4 删除表

4.1 删除表(使用视图)

如果要删除的表中有作为外键的列,则先删除外键所在的表,然后再删除本表。
如下图的关系图中,如果要删除这些表,删除表的顺序时OrderInfo ->UserInfo ->CommodityInfo ->CommoditySort
请添加图片描述

4.2 删除表(使用SQL语句)

语法
DROP TABLE <表名>

需要注意
如果删除的表已经被删除了,执行删除语句就会有报错。
所以,删除表之前,先检查表是否存在,如果存在就执行删除。

举例:删除表CommodityInfo

USE E_Market
GO

--如果存在就将表删除,否则不执行删除语句
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'CommodityInfo')
DROP TABLE CommodityInfo
GO
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值