一个SQL Server 数据库可以容纳20多亿个表,每个表最多可以有1024个字段
创建数据表
语法
CREATE TABLE [<database_name>.[<schema_name>].] <table_name>({<column_name> <data_type>[NULL | NOT NULL][IDENTITY[(<seed>,<increment>)]][DEFAULT default_value][<column_constraint>[...n]][,...n]}[,<table_constraint>][,...n])
database_name:数据库名,不写就是默认的当前数据库 schema_name:新数据表所属的架构名称,为空就用当前架构 table_name:表名 column_name:字段名,列名 data_type:指定的数据类型 NULL | NOT NULL:是否允许空值 DEFAULT:指定有没有默认值 default_value:这个是默认值的表达式,默认值 column_constraint:在列级上定义约束 table_constraint:在表级上定义约束 IDENTITY:自增,seed起始种子,默认1,increment增量,默认1
例子
create table S..TableName2(ID int primary key not null,Sex nvarchar default '男',A1 int unique,)
管理数据表
ALTER TABLE语法
ALTER TABLE <table_name>[ALTER COLUMN <column_name> <new_data_type> <NULL | NOT NULL>]| ADD {<column_defintion>|<table_constrain>[,...n]}| DROP {[CONSTRAINT]<constraint_name>| COLUMN <column_name>}[,...n]
ALTER COLUMN:修改某列的数据类型 ADD:添加一列或者添加表约束,column_defintion和table_constrain,列定义和表约束和创建表一样的写法 DROP:删除约束,或者删除某列
例子
1.添加字段
可以多列一同添加
ALTER TABLE Table1ADD name NVARCHAR(10) NOT NULL
2.修改字段
ALTER TABLE Table1ALTER COLUMN name VARCHAR(8)
3.删除字段
可以多列一同删除
ALTER TABLE Table1DROP COLUMN name
4.修改列名
使用存储过程sp_rename
sp_rename '表名.列名','新列名','COLUMN'
5.修改表名
使用存储过程sp_rename
sp_rename <table_name>,<new_table_name>
6.删除数据表
慎用,曾经有一次误删了一张有重要数据的表,表结构都没了。一个通宵才勉强恢复,噩梦。
DROP TABLE <table_name>[,...n]
约束
约束是用来保证数据库完整的一种方式。设计数据表时,需要定义列的有效值,并通过限制字段中数据,记录中数据以及数据表之间的数据来保证数据的完整性,约束是独立于表结构的,它作为数据库定义的一部分在创建数据表时声明,也可以通过ALTER TABLE进行添加或者删除
数据完整性
数据完整性是指数据的正确性,有效性和相容性,主要用于保证数据库中数据的质量。可以分成三类,实体完整性,参照完整性,用户定义完整性。
1.实体完整性
用于保证表中每一行数据在表中是唯一的,保证实体完整性可以用PRIMARY KEY主键约束,UNIQUE唯一约束,IDENTITY自增列
2.参照完整性
又叫引用完整性,是建立在外键和主键之间的一种引用规则。FOREIGN KEY外键约束
3.用户定义完整性
就是针对某一具体情况而设置的约束,比如:姓名不能取空值,年龄的取值范围在1-130…..等。保证用户定义完整性的方式是,限制数据类型或格式,CHECK检查约束,DEFAULT默认约束,NOT NULL非空约束等。
约束分类
SQL Server有6中约束
主键约束(PRIMARY KEY) 唯一性约束(UNIQUE) 检查约束(CHECK) 默认约束(DEFAULT) 外键约束(FOREIGN KEY) 非空约束(NOT NULL)
创建约束
CREATE TABLE创建
CREATE TABLE <表名>(<列定义>[,...n][,<表约束>[,...n]])
ALTER TABLE创建
ALTER TABLE <表名>ADD {<表约束>}
在SQL Server中约束分为列约束和表约束。 列约束是对某一特定列的约束,包含在列定义中,直接跟在该列的定义之后,用空格分隔不用指定列名。 表约束是与列定义相互独立的,不包含在列定义中通常用于多个列一起进行约束,与列定义用逗号分隔,定义表约束必须指定要约束的列名
1.主键约束PRIMARY KEY
用于指定表的一列或者几列的组合来唯一标识表,它可以唯一确认表中的每一条记录。最重要的一种约束。每张表中只能有一个主键约束,并且不能为空,不可重复。一张表一个主键。
1.1列主键约束
CREATE TABLE <table_name>(<列名> <列属性> [CONSTRAINT <约束名>] PRIMARY KEY [CLUSTERED|NONCLUSTERED][,...n])
1.2组合主键约束
用表约束
CREATE TABLE <table_name>(<列定义>[,...n],[CONSTRAINT <约束名>] PRIMARY KEY [CLUSTERED|NONCLUSTERED] (<列名>[,...n]))
约束名在数据库中必须是唯一的,CLUSTERED,NONCLUSTERED表示在创建主键时自动创建索引的类别,主键约束CLUSTERED是默认值,表示创建聚集索引。NONCLUSTERED是非聚集索引
1.3ALTER添加主键约束
ALTER TABLE <table_name>ADD CONSTRAINT <约束名> PRIMARY KEY [CLUSTERED|NONCLUSTERED] (<列名>[,...n])
1.4ALTER删除主键约束
ALTER TABLE <table_name>DROP [CONSTRAINT] <约束名>[,...n]
2.唯一性约束UNIQUE
指定非主键的一个列或者多个列的组合值具有唯一性。一张表可以定义多个唯一性约束。可以为空,但只能有一个NULL值。唯一性约束用于强制在指定字段上创建一个唯一性索引。默认情况系创建的索引类型为非聚集索引NONCLUSTERED。
2.1创建唯一约束
三种方式和主键约束一样,把PRIMARY KEY 改成 UNIQUE
3.外键约束FOREIGN KEY
外键约束强制实现参照完整性,外键和另一个表的主键相关联,外键约束定义一个列或者多个列的组合为当前表的外键。外键和相关联的主键必须数据类型一样,而且外键的值必须在主键里面存在。外键不能自动创建索引,需要手动创建。一个数据表中最多可以有31个外键约束。
3.1ALTER添加外键约束
ALTER TABLE <外键表名>ADD [CONSTRAINT] <外键约束名>FOREIGN KEY (<外键表的外键列名>[,...n])REFERENCES <主键表名> (<主键表的主键列名>[,...n])[ON DELETE { CASCADE | NO ACTION | SET NULL | SET DEFAULT }][ON UPDATE { CASCADE | NO ACTION | SET NULL | SET DEFAULT }]
ON DELETE:用来规定从主键表中删除记录时,外键表中的记录将执行什么操作。 ON UPDATE:用来规定从主键表中更新记录时,外键表中的记录将执行什么操作。 CASCADE:从主键表中删除一行记录时,外键表中的相应记录也会被删除。 NO ACTION:从主键表中删除一行记录时,外键表不做任何操作。若外键表中有相关的数据,则返回删除失败的错误信息,此项为默认值。 SET NULL:从主键表中删除一行记录时,外键表中相应的记录各列被赋予空值。 SET DEFAULT:从主键表中删除一行记录时,外键表中相应的记录被赋予默认值。
3.2建表时创建外键约束
3.1的外键语法结合主键的建表时创建的语法,大同小异。
4.检查约束check
检查约束通过控制列值得范围来实现用户定义完整性。
检查约束对输入列或者整个数据表中的值设置检查条件,以限制输入值,保证数据库中的数据的完整性。检查约束通过数据逻辑表达式确认有效值。
对同一个列可以定义多个检查约束。
比如年龄,限制在1-100之间,可以通过返回ture或false的逻辑表达式限定,如1<=age AND age<=100
但是标识列,ROWGUIDCOL列或者数据类型为TIMESTAMP不能定义为检查约束,因为这几类列的列值由数据库自动添加。
4.1建表时添加检查约束
CREATE TABLE <table_name>(<列名> <列属性> [CONSTRAINT <约束名>] CHECK(<逻辑表达式>)[,...n])
逻辑表达式,如果被设置为检查约束的列名叫age,逻辑表达式例子:1<=age AND age<=100 表约束一样的创建方法
4.2ALTER添加检查约束
ALTER TABLE <table_name> [WHIT {CHECK | NOCHECK }]ADD CONSTRAINT <检查约束名> CHECK(<逻辑表达式>)
WHIT CHECK:对表中已有数据进行检查约束,默认值 WHIT NOCHECK:对表中有的记录不进行检查约束,只对以后插入的新数据记录进行检查。
5.默认约束DEFAULT
在添加数据时,如果没有插入数据,系统自动插入默认值,即便该值是NULL。
每个字段定义一个默认约束。
如果默认值长于其对应的字段,则输入到数据表中默认值将被截断。
不能加入到带有IDENTITY属性或者TIMESTAMP的字段上,这些列系统会自动添加数据,用DEFAULT没有意义。
5.1建表时创建默认约束
5.2ALTER添加默认约束
ALTER TABLE <table_name>ADD CONSTRAINT <检查约束名> DEFAULT(<表达式>) FOR <列名>
6.非空约束NOT NULL
在建表的时候列定义里面加上NOT NULL或者NULL。
或者通过ALTER修改列
默认值
和默认约束一个作用。不同的是,默认值是一种数据库对象,在数据库中创建默认值对象后,可以将其绑定到多个数据表的一个或者多个列应用。而默认约束只能用语约束一个表中的列。
创建默认值对象
CREATE DEFAULT <默认值对象名称> AS <只包含常量值得表达式>
默认值绑定
sp_bindefault <默认值对象名称>,'<被绑定默认值的列名或者用户定义数据类型>'[,'<futureonly_flag>']
futureonly_flag:当默认值绑定到用户定义的数据类型时才能使用。参数设置为futureonly时,该数据类型的现有列无法继承新的默认值。如果futureonly_flag为NULL,则新的默认值将绑定到用户定义数据类型的所有列,默认值为NULL。
删除默认值
如果默认值对象已经绑定到数据对象,无法直接删除。正确的删除方法是,先解除所的绑定,再删除。
futureonly_flag仅在接触用户自定义数据类型的默认值绑定时使用。默认值为NULL。当futureonly_flag的数据类型为futureonly时,该数据类型的现有列不会失去指定的默认值。
解除绑定
sp_unbindefault '<被绑定默认值的列名或者用户定义数据类型>' [,'<futureonly_flag>'][,]
删除默认值对象
DROP DEFAULT <默认值对象名>[,...n]
规则
和CHECK检查约束很像。
规则是一种数据库对象,与其作用的表和用户自定义数据类型是相互独立的。规则和约束可以同时使用。表中的列可以有一个规则或者多个CHECK检查约束。
创建规则
CREATE RULE <规则名> AS <规则定义>
规则定义:可以是用于WHERE条件子句中的任何表达式。
规则绑定
sp_bindrule <规则名> ,'<要绑定规则的列名或用户定义数据类型>',[,'<futureonly_flag>']
futureonly_flag:仅当将规则绑定到用户自定义数据类型时才能使用。当此参数设置为futureonly时,可以防止具有用户自定义类型的洗哪有列继承新的规则。如果为NULL,则将新规这绑定应用到所有用户自定义数据类型列上。默认值NULL。
例子
--创建规则,可以使用任何名称或者符号表示值,但是第一个字符必须是@符号,这里用的是@xbCREATE RULE rl_sex AS @xb='男' OR @xb='女'--绑定规则sp_bindrule rl_sex,'student.sex'
规则删除
解除绑定
sp_unbindrule '<要绑定规则的列名或用户定义数据类型>'[,'<futureonly_flag>']
futureonly_flag仅在取消用户自定义数据类型的绑定是使用。当futureonly_flag的数据类型为futureonly时,该数据类型的现有列不会失去指定规则。默认值为NULL
删除规则
DROP RULE <规则名>[,...n]
表数据更新
添加数据
INSERT [INTO] {<表名>|<视图名>} [(<列名>[,...n])] {VALUES({DEFAULT | NULL | <值表达式>}[,...n])|<derived_table>}
INTO:可有可无的关键字 derived_table:任何有效的SELECT语句,把查询结果插入表中。
列名和值在个数和类型上应保持一一对应,如果提供表中所有列的值,则列名列表可以省略,这时候必须保证提供的值得顺序与列定义的顺序一一对应。
在插入数据时应该考虑约束问题,违反约束则无法插入。
修改数据
UPDATE {<表名>|<视图名>} SET <列名> = {<值表达式> | DEFAULT | NULL}[,...n] [FROM <表源>[,...n]] [WHERE <条件>]
没有WHERE子句,会修改表中所有的数据
删除数据
DELETE [FROM] {<表名>|<视图名>} [WHERE <条件>]
不加WHERE子句,会删除整张表的所有数据
