一个SQL Server 数据库可以容纳20多亿个表,每个表最多可以有1024个字段

创建数据表

语法

  1. CREATE TABLE [<database_name>.[<schema_name>].] <table_name>(
  2. {<column_name> <data_type>
  3. [NULL | NOT NULL]
  4. [IDENTITY[(<seed>,<increment>)]]
  5. [DEFAULT default_value]
  6. [<column_constraint>[...n]]
  7. [,...n]}
  8. [,<table_constraint>][,...n]
  9. )

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

例子

  1. create table S..TableName2(
  2. ID int primary key not null,
  3. Sex nvarchar default '男',
  4. A1 int unique,
  5. )

管理数据表

ALTER TABLE语法

  1. ALTER TABLE <table_name>
  2. [ALTER COLUMN <column_name> <new_data_type> <NULL | NOT NULL>]
  3. | ADD {<column_defintion>|<table_constrain>[,...n]}
  4. | DROP {[CONSTRAINT]<constraint_name>| COLUMN <column_name>}[,...n]

ALTER COLUMN:修改某列的数据类型 ADD:添加一列或者添加表约束,column_defintion和table_constrain,列定义和表约束和创建表一样的写法 DROP:删除约束,或者删除某列

例子

1.添加字段

可以多列一同添加

  1. ALTER TABLE Table1
  2. ADD name NVARCHAR(10) NOT NULL

2.修改字段

  1. ALTER TABLE Table1
  2. ALTER COLUMN name VARCHAR(8)

3.删除字段

可以多列一同删除

  1. ALTER TABLE Table1
  2. DROP COLUMN name

4.修改列名

使用存储过程sp_rename

  1. sp_rename '表名.列名','新列名','COLUMN'

5.修改表名

使用存储过程sp_rename

  1. sp_rename <table_name>,<new_table_name>

6.删除数据表

慎用,曾经有一次误删了一张有重要数据的表,表结构都没了。一个通宵才勉强恢复,噩梦。

  1. 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创建

  1. CREATE TABLE <表名>
  2. (
  3. <列定义>[,...n]
  4. [,<表约束>[,...n]]
  5. )

ALTER TABLE创建

  1. ALTER TABLE <表名>
  2. ADD {<表约束>}

在SQL Server中约束分为列约束和表约束。 列约束是对某一特定列的约束,包含在列定义中,直接跟在该列的定义之后,用空格分隔不用指定列名。 表约束是与列定义相互独立的,不包含在列定义中通常用于多个列一起进行约束,与列定义用逗号分隔,定义表约束必须指定要约束的列名

1.主键约束PRIMARY KEY

用于指定表的一列或者几列的组合来唯一标识表,它可以唯一确认表中的每一条记录。最重要的一种约束。每张表中只能有一个主键约束,并且不能为空,不可重复。一张表一个主键。

1.1列主键约束

  1. CREATE TABLE <table_name>
  2. (
  3. <列名> <列属性> [CONSTRAINT <约束名>] PRIMARY KEY [CLUSTERED|NONCLUSTERED]
  4. [,...n]
  5. )

1.2组合主键约束

用表约束

  1. CREATE TABLE <table_name>
  2. (
  3. <列定义>[,...n],
  4. [CONSTRAINT <约束名>] PRIMARY KEY [CLUSTERED|NONCLUSTERED] (<列名>[,...n])
  5. )

约束名在数据库中必须是唯一的,CLUSTERED,NONCLUSTERED表示在创建主键时自动创建索引的类别,主键约束CLUSTERED是默认值,表示创建聚集索引。NONCLUSTERED是非聚集索引

1.3ALTER添加主键约束

  1. ALTER TABLE <table_name>
  2. ADD CONSTRAINT <约束名> PRIMARY KEY [CLUSTERED|NONCLUSTERED] (<列名>[,...n])

1.4ALTER删除主键约束

  1. ALTER TABLE <table_name>
  2. DROP [CONSTRAINT] <约束名>[,...n]

2.唯一性约束UNIQUE

指定非主键的一个列或者多个列的组合值具有唯一性。一张表可以定义多个唯一性约束。可以为空,但只能有一个NULL值。唯一性约束用于强制在指定字段上创建一个唯一性索引。默认情况系创建的索引类型为非聚集索引NONCLUSTERED。

2.1创建唯一约束

三种方式和主键约束一样,把PRIMARY KEY 改成 UNIQUE

3.外键约束FOREIGN KEY

外键约束强制实现参照完整性,外键和另一个表的主键相关联,外键约束定义一个列或者多个列的组合为当前表的外键。外键和相关联的主键必须数据类型一样,而且外键的值必须在主键里面存在。外键不能自动创建索引,需要手动创建。一个数据表中最多可以有31个外键约束。

3.1ALTER添加外键约束

  1. ALTER TABLE <外键表名>
  2. ADD [CONSTRAINT] <外键约束名>
  3. FOREIGN KEY (<外键表的外键列名>[,...n])
  4. REFERENCES <主键表名> (<主键表的主键列名>[,...n])
  5. [ON DELETE { CASCADE | NO ACTION | SET NULL | SET DEFAULT }]
  6. [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建表时添加检查约束

  1. CREATE TABLE <table_name>
  2. (
  3. <列名> <列属性> [CONSTRAINT <约束名>] CHECK(<逻辑表达式>)
  4. [,...n]
  5. )

逻辑表达式,如果被设置为检查约束的列名叫age,逻辑表达式例子:1<=age AND age<=100 表约束一样的创建方法

4.2ALTER添加检查约束

  1. ALTER TABLE <table_name> [WHIT {CHECK | NOCHECK }]
  2. ADD CONSTRAINT <检查约束名> CHECK(<逻辑表达式>)

WHIT CHECK:对表中已有数据进行检查约束,默认值 WHIT NOCHECK:对表中有的记录不进行检查约束,只对以后插入的新数据记录进行检查。

5.默认约束DEFAULT

在添加数据时,如果没有插入数据,系统自动插入默认值,即便该值是NULL。
每个字段定义一个默认约束。
如果默认值长于其对应的字段,则输入到数据表中默认值将被截断。
不能加入到带有IDENTITY属性或者TIMESTAMP的字段上,这些列系统会自动添加数据,用DEFAULT没有意义。

5.1建表时创建默认约束

和检查约束差不多,逻辑表达式,换成一个表达式值

5.2ALTER添加默认约束

  1. ALTER TABLE <table_name>
  2. ADD CONSTRAINT <检查约束名> DEFAULT(<表达式>) FOR <列名>

6.非空约束NOT NULL

在建表的时候列定义里面加上NOT NULL或者NULL。

或者通过ALTER修改列

默认值

和默认约束一个作用。不同的是,默认值是一种数据库对象,在数据库中创建默认值对象后,可以将其绑定到多个数据表的一个或者多个列应用。而默认约束只能用语约束一个表中的列。

创建默认值对象

  1. CREATE DEFAULT <默认值对象名称> AS <只包含常量值得表达式>

默认值绑定

  1. sp_bindefault <默认值对象名称>,'<被绑定默认值的列名或者用户定义数据类型>'[,'<futureonly_flag>']

futureonly_flag:当默认值绑定到用户定义的数据类型时才能使用。参数设置为futureonly时,该数据类型的现有列无法继承新的默认值。如果futureonly_flag为NULL,则新的默认值将绑定到用户定义数据类型的所有列,默认值为NULL。

删除默认值

如果默认值对象已经绑定到数据对象,无法直接删除。正确的删除方法是,先解除所的绑定,再删除。

futureonly_flag仅在接触用户自定义数据类型的默认值绑定时使用。默认值为NULL。当futureonly_flag的数据类型为futureonly时,该数据类型的现有列不会失去指定的默认值。

解除绑定

  1. sp_unbindefault '<被绑定默认值的列名或者用户定义数据类型>' [,'<futureonly_flag>'][,]

删除默认值对象

  1. DROP DEFAULT <默认值对象名>[,...n]

规则

和CHECK检查约束很像。
规则是一种数据库对象,与其作用的表和用户自定义数据类型是相互独立的。规则和约束可以同时使用。表中的列可以有一个规则或者多个CHECK检查约束。

创建规则

  1. CREATE RULE <规则名> AS <规则定义>

规则定义:可以是用于WHERE条件子句中的任何表达式。

规则绑定

  1. sp_bindrule <规则名> ,'<要绑定规则的列名或用户定义数据类型>',[,'<futureonly_flag>']

futureonly_flag:仅当将规则绑定到用户自定义数据类型时才能使用。当此参数设置为futureonly时,可以防止具有用户自定义类型的洗哪有列继承新的规则。如果为NULL,则将新规这绑定应用到所有用户自定义数据类型列上。默认值NULL。

例子

  1. --创建规则,可以使用任何名称或者符号表示值,但是第一个字符必须是@符号,这里用的是@xb
  2. CREATE RULE rl_sex AS @xb='男' OR @xb='女'
  3. --绑定规则
  4. sp_bindrule rl_sex,'student.sex'

规则删除

解除绑定

  1. sp_unbindrule '<要绑定规则的列名或用户定义数据类型>'[,'<futureonly_flag>']

futureonly_flag仅在取消用户自定义数据类型的绑定是使用。当futureonly_flag的数据类型为futureonly时,该数据类型的现有列不会失去指定规则。默认值为NULL

删除规则

  1. DROP RULE <规则名>[,...n]

表数据更新

添加数据

  1. INSERT [INTO] {<表名>|<视图名>} [(<列名>[,...n])] {VALUES({DEFAULT | NULL | <值表达式>}[,...n])|<derived_table>}

INTO:可有可无的关键字 derived_table:任何有效的SELECT语句,把查询结果插入表中。

列名和值在个数和类型上应保持一一对应,如果提供表中所有列的值,则列名列表可以省略,这时候必须保证提供的值得顺序与列定义的顺序一一对应。
在插入数据时应该考虑约束问题,违反约束则无法插入。

修改数据

  1. UPDATE {<表名>|<视图名>} SET <列名> = {<值表达式> | DEFAULT | NULL}[,...n] [FROM <表源>[,...n]] [WHERE <条件>]

没有WHERE子句,会修改表中所有的数据

删除数据

  1. DELETE [FROM] {<表名>|<视图名>} [WHERE <条件>]

不加WHERE子句,会删除整张表的所有数据