-----------------------接Part 8-------------------
3 范式的概念
第一范式的目标是确保每列的原子性。
如果每列都是不可再分的最小单元(也称为最小的原子单位。),则满足第一范式(1NF)
第二范式要求每个表只描述一件事情。
如果一个关系满足1NF,并且除了主键以外的其它列,都依赖该主键,则满足第二范式。(2NF)
第三范式
如果一个关系满足2NF,并且除了主键以外的其它列都不传递依赖于主键,则满足第三范式(3NF)。
第一范式(1NF)的目标:确保每列的原子性。
第二范式(2NF)的目标:确保表中的每列,都和主键相关,即不存在部分依赖
第三范式(3NF)的目标:确保每列都和主键列直接相关,而不是间接相关,即不存在传递函数依赖
4 T-SQL创建数据库的语法:
CREATE DATABASE 数据库名
ON [PRIMARY]
(
<</span>数据文件参数> [,…n] [<</span>文件组参数>]
)
[LOG ON]
(
<</span>日志文件参数> [,…n]
)
示例
--创建学生数据库:一个数据文件,一个日志文件
CREATE DATABASE studentDB
ON PRIMARY--默认就是属于PRIMARY主文件,可以省略
(
NAME='stdDB_data',--主数据文件的逻辑名
FILENAME='E:\SQL\stuDB.mdf',--主数据文件的物理名
SIZE=3mb,--主数据文件的初始大小
MAXSIZE=10mb,--主数据文件的增长的最大值
FILEGROWTH=10%--主数据文件的增长率
)
LOG ON
(
NAME='stuDB_log',
FILENAME='E:\SQL\stuDB_log.ldf',
SIZE=3mb,
MAXSIZE=10mb,
FILEGROWTH=1mb
)
GO
注意:这里的两个name参数不能一样的逻辑名,否则会提示逻辑文件名xxx已被使用,请选择另一个名称
--创建学生数据库:多个数据文件,多个日志文件
CREATE DATABASE employeeDB
ON PRIMARY--默认就是属于PRIMARY主文件,可以省略
(
NAME='employee1_data',--主数据文件的逻辑名
FILENAME='E:\SQL\employee1.mdf',--主数据文件的物理名
SIZE=3mb,--主数据文件的初始大小
MAXSIZE=10mb,--主数据文件的增长的最大值
FILEGROWTH=10%--主数据文件的增长率
),
(
NAME='employee2_data',--主数据文件的逻辑名
FILENAME='E:\SQL\employee2.mdf',--主数据文件的物理名
SIZE=3mb,--主数据文件的初始大小
MAXSIZE=10mb,--主数据文件的增长的最大值
FILEGROWTH=10%--主数据文件的增长率
)
LOG ON
(
NAME='employee1_log',
FILENAME='E:\SQL\employee1_log.ldf',
SIZE=3mb,
MAXSIZE=10mb,
FILEGROWTH=1mb
),
(
NAME='employee2_log',
FILENAME='E:\SQL\employee2_log.ldf',
SIZE=3mb,
MAXSIZE=10mb,
FILEGROWTH=1mb
)
GO
USE master --设置当前数据库为master,以便访问sysdatabase表
GO
IF EXISTS(SELECT * FROM sysdatabases WHERE name='stuDB')
DROP DATABASE stuDB
CREATE DATABASE stuDB
ON PRIMARY
(
NAME='stdDB2_data',--主数据文件的逻辑名
FILENAME='E:\SQL\stuDB2.mdf',--主数据文件的物理名
SIZE=3mb,--主数据文件的初始大小
MAXSIZE=10mb,--主数据文件的增长的最大值
FILEGROWTH=10%--主数据文件的增长率
)
LOG ON
(
NAME='stuDB_log',
FILENAME='E:\SQL\stuDB2_log.ldf',
SIZE=3mb,
MAXSIZE=10mb,
FILEGROWTH=1mb
)
GO
说明:EXISTS()语句:检测是否存在stuDB数据库如果存在stuDB数据库,则删除
--创建表
USE stuDB--将当前数据库设置为stuDB
GO
CREATE TABLE stuInfo
(
stuName VARCHAR(20) NOT NULL, --姓名,非空(必填)
stuNo CHAR(6) NOT NULL, --学号,非空(必填)
stuID NUMERIC(18,0),
stuSeat SMALLINT IDENTITY(1,1), --座位号,自动编号
stuAddress TEXT --住址,允许为空,即可选输入
)
GO
说明:NUMERIC (18,0)
代表18位数字,小数位数为0
IDENTITY(起始值,递增量)
5 约束
目的:确保表中数据的完整型
常用的约束类型:
1) 主键约束(Primary Key Constraint):要求主键列数据唯一,并且不允许为空
2) 唯一约束(Unique Constraint):要求该列唯一,允许为空,但只能出现一个空值。
3) 检查约束(Check Constraint):某列取值范围限制、格式限制等,如有关年龄的约束
4) 默认约束(Default Constraint):某列的默认值,如我们的男性学员较多,性别默认为“男”
5) 外键约束(Foreign Key Constraint):用于两表间建立关系,需要指定引用主表的那列
添加约束的语法:
ALTER TABLE 表名
ADD CONSTRAINT 约束名 约束类型 具体的约束说明
其中,约束名的取名规则推荐采用:约束类型_约束字段
a) 主键(Primary Key)约束:如 PK_stuNo
b) 唯一(Unique Key)约束:如 UQ_stuID
c) 默认(Default Key)约束:如 DF_stuAddress
d) 检查(Check Key)约束:如 CK_stuAge
e) 外键(Foreign Key)约束:如 FK_stuNo
示例
--给stuInfo表添加约束
ALTER TABLE stuInfo
ADD CONSTRAINT PK_stuNo PRIMARY KEY (stuNo)
ALTER TABLE stuInfo
ADD CONSTRAINT UQ_stuID UNIQUE(stuID)
ALTER TABLE stuInfo
ADD CONSTRAINT DF_stuAddress
DEFAULT ('地址不详') FOR stuAddress
ALTER TABLE stuInfo
ADD CONSTRAINT CK_stuAge
CHECK(stuNo BETWEEN 1 AND 60)
ALTER TABLE stuInfo
ADD CONSTRAINT FK_stuNo
FOREIGN KEY(stuNo) REFERENCES stuInfo(stuNo)
GO