数据表的种种操作(上)
表概述
表是数据库中最重要、最基本的数据库对象,数据库中的所有数据都存储在表中。在数据库中,表是按照行与列的表格结构存储数据的。
表的概念
表是用于存储数据的逻辑结构,是关系模型中实体的表示方式,也是用于组织和存储具有行列结构的数据对象。行是组织数据的单位,列是用于描述数据的属性,每一行都表示一条完整的信息记录,而每一列表示记录中相同的元素属性值。
数据库中表具有以下几个特点:
- 表通常代表一个实体
- 表由行与列组成
- 行值在同一个表中具有唯一性
- 列名在同一个表中具有唯一性
- 行和列的无序性
系统表和临时表
- 系统表
在创建好的每个数据库中,系统都会自动添加一个系统表,该表存储了与系统有关的各种信息,例如,服务器配置,数据库设置,用户和表对象的描述等信息。通常只有具有DBO权限的用户才能对该表进行操作。
- 临时表
临时表就是临时创建,不能永久保存的表。临时表分为两种:即本地临时表和全局临时表。本地临时表的表名前通常带有“#”标识符。它只对当前用户可见,当用户断开与SQL server实例连接时,将自动删除该临时表。全局临时表的表名前通常带有“##”标识符,这也是与本地临时表表名的区别。全局临时表对于当前连接SQL server实例的所有用户都可见,当所有引用该表的用户都断开与SQL server实例连接时,将自动删除该临时表,并且所有的用户都可以创建临时表。
CREATE TABLE创建表
语法
CREATE TABLE
{ database_name.schema_name.table_name | schema_name.table_name | table_name}
[AS FileTable]
({ <column_definition>
| <computed_column_definition>
| <column_set_definition>
| [<table_constraint>][,...n]
| [<table_index> ]}
[,...]
[PERIOD FOR SYSTEM_TIME ( system_start_time_column_name,
system_end_time_column_name)]
)
[ ON { partition_scheme_name ( partition_column_name )
| filegroup
| "default"}]
[TEXTIMAGE_ON { filegroup | "defualt"}]
[FILESTREAM_ON {partition_scheme_name
| filegroup
| "default"}]
[WITH ( <table_option> [,...n])]
[;]
<column_definition>::=
column_name <data_type>
[FILESTREAM]
[COLLATE collation_name]
[SPARSE]
[MASKED WITH (FUNCTION = 'mask_function')]
[[CONSTRAINT constraint_name] DEFAULT constant_expression]
[IDENTITY [(seed,increment)]
[NOT FOR REPLICATION]
[GENERATED ALWAYS AS ROW {START | END} [HIDDEN]]
[NULL | NOT NULL]
[ROWGUIDCOL]
[ENCRYPTED WITH
(COLUMN_ENCRYPTION_KEY = key_name,
ENCRYPTION_TYPE = {DETERMINISTIC | RANDOMIZED},
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
)]
[<coulmn_constraint>[,...n]]
[<column_index>]
<data_type>::=
[type_schema_name.]type_name
[(precision[,scale] | max | [{CONTENT | DOCUMENT}] xml_schema_collection)]
<column_constraint>::=
[CONSTRAINT constraint_name]
{ {PRIMARY KEY | UNIQUE}
[ CLUSTERED | NONCLUSTERED ]
[ WITH FILLFACTOR = fillfactor
| WITH (<index_option>[,...n])
]
[ON {partition_scheme_name (partition_column_name)
| filegroup |"defualt"}]
|[FOREIGN KEY]
REFERENCES [schema_name.] referenced_table_name[(ref_column)]
[ON DELETE {ON ACTION | CASCADE | SET NULL | SET DEFAULT}]
[ON UPDATE {ON ACTION | CASCADE | SET NULL | SET DEFAULT}]
[NOT FOR REPLICATION]
|CHECK [NOT FOR REPLICATION ](logical_expression)
}
<column_index>::=
INDEX index_name[ CLUSTERED | NONCLUSTERED ]
[WITH (<index_option>[,...n])]
[ON { partition_scheme_name (column_name)
| filegroup_name
|default
}
]
[FILESTREAM_ON {filestream_filegroup_name | partition_scheme_name | "NULL"}]
创建主键列
表通常具有包含唯一标识表中每一行值的一列或一组列,这样的一列或多列称为表的主键(PK)。用于实现表的实体完整性,在创建或修改表时,可以通过关键字PRIMARIY KEY来创建主键。
主键列不可重复,当由多个列组成主键列时,则该几列的组合值没有重复,单列可以存在重复。
不同列之间用逗号分隔,所有列信息都在同一个括号中。
这种创建单个列为主键列的方式,将主键定义在列级上。
这种创建多列为主键列的方式,将主键定义在表级上。
创建外键
外键主要用于定义数据库的参照完整性,通过使用FOREIGN KEY关键字定义外键。
当该列的值全部是参照另外一张表中某列的内容时,可以使用外键来定义这种关系,以确保参照完整性。
创建非空列
在数据库中空由NULL表示,表示没有数据值,不等同于“”,零或者空白。
列的属性是否为空决定着该列是否必须指定相应的数据值。
当某列的属性设置为NOT NULL时,那么在插入数据时必须为该列提供具体的数据值,否则系统将提示出错。
创建默认值定义
默认值是指如果插入行时没有为该列指定具体的数值,则使用定义的默认值指定该列的值,用户可以通过DEFAULT关键字来创建默认值。
创建CHECK约束列
在创建表时,用户可以使用CHECK约束进行自定义表的约束条件。用户既可以在创建表时将CHECK约束作为表的一部分,如果表已经存在也可以添加CHECK约束,在表和列中可以包含多个CHECK约束。
创建自动编号列
SQL Server使用IDENTITY关键字定义的字段叫标识字段。标识字段体现了数据的唯一性,当某个字段设置为标识字段时,则该字段中不允许存在重复的数据值。当一个新记录添加到这个表中时,这个字段就被自动赋给一个新值。每个表中有且只能有一个标识字段。
自动编号列的数据类型必须要为整数类型
创建唯一列
SQL Server使用UNIQUE关键字来指定数据列的唯一性。
列数据类型
观察表的创建过程可以发现,每个列都需要指定特定的数据类型,SQL Server中提供了36种数据类型,包括精确数字类型、近似数字类型、Unicode字符数据类型、二进制数据类型、时间和日期数据类型、字符串数据类型等。当字段指定为数据类型时,不仅需要指定数据种类,而且应指定数据的大小或长度。当字段指定为数字类型时,需要指定数字的精度和小数的位数。
整型数字类型
数据类型 | 范围 | 字节数 |
bigint | 8 | |
int | 4 | |
smallint | 2 | |
tinyint | 0···255 | 1 |
bit | 0 | 1 | 1 |
money | 8 | |
smallmoney | 4 |
浮点型数字类型
数据类型 | 范围 | 最大精度 | 语法格式 | 字节数 |
float | -1.79E-308···1.79E+308 | 15 | float(n) | 8 |
real | -3.4E-38···3.4E+38 | 7 | real(n) | 4 |
decimal | 38 | decimal(p,s) | 17 | |
numeric | 38 | numeric(p,s) | 17 |
Unicode字符数据类型
数据类型 | 长度 | 语法格式 |
nchar | 1~4000 | nchar(n) |
nvarchar | nvarchar[(n|max)] | |
ntext |
二进制数据类型
数据类型 | 长度 | 语法格式 |
binary | 0~8000 | binary[(n)] |
varbinary | varbinary[(n|max)] | |
image |
如果某个数据的值超过了数据定义时规定的最大长度,则多余的值会被服务器自动截去,如果是使用binary数据类型,则数据长度不够时,服务器会在多余的字节上补充0.
日期和时间数据类型
数据类型 | 范围 | 语法格式 |
date | 0001-01-01~9999-12-31 | date |
time | 00:00:00.0000000~23:59:59.999999 | time |
datetimeoffset | 日期0001-01-01~9999-12-31 | datetimeoffset[(fractional seconds precision)] |
datetimeoffse | 时间00:00:00.0000000~23:59:59.999999 | |
datetime2 | 日期0001-01-01~9999-12-31 | datetime2[(fractional seconds precision)] |
datetime2 | 时间00:00:00.0000000~23:59:59.999999 |
字符串数据类型
数据类型 | 长度 | 语法格式 |
char | 1~8000 | char(n) |
varchar | 0~8000 | varchar(n) |
text |
其他数据类型
数据类型 | 作用 |
sql_variant | 用于存储各种数据类型 |
timestamp | 用于反映数据库中数据修改的相对顺序 |
uniqueidentifier | 用于存储一个16字节长的二进制数据 |
xml | 用来保存整个XML文档 |
table | 用于存储对表或视图查询后的结果集 |
cursor | 用于对记录进行逐条处理 |
cursor数据类型不可用在CREATE TABLE中。
sql_variant类型使用时影响性能。
创建自定义数据类型
用户基于系统的数据类型而设计并实现的数据类型就称为用户自定数据类型。
EXEC
sp_addtype [@typename =] type,
[@phystype =] system_data_type,
[[@nulltype =] 'null_type'];
使用自定义数据类型定义表。
删除自定义数据类型
EXEC sp_droptype type_name