七SQL Server数据表管理
Posted 摸爬滚打的程序媛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了七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 约束的类型
- 主键约束: 要求主键列不能为空,要求主键列唯非空约束:要求该列不能存在空值
- 唯一约束: 要求该列的值必须是唯一的,允许为空,但
只能出一同个空值 - 检查约束: 限制某列取值的范围是否合适默认约束:设计某列的默认值
- 外键约束: 用于在两表之间建立关系,需要指定引用主
表是哪一列
3.2.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
以上是关于七SQL Server数据表管理的主要内容,如果未能解决你的问题,请参考以下文章