【网学网提醒】:网学会员为大家收集整理了sqlserver部分操作语法提供大家参考,希望对大家有所帮助!
使用SQLServer服务管理器
如果运行的是MicrosoftWindows98,则SQLServer服务管理器可用于启动、暂停、停止和检查本地服务的状态,但不能远程管理服务。
SQLServer企业管理器
可以设置SQLServer企业管理器检查SQLServer、SQLServer代理程序、全文检索功能(作为Microsoft搜索服务运行)、SQL邮件、复制监视器和Microsoft分布式事务处理协调器(MSDTC)状态的间隔,以确定它们是正在运行、已暂停还是已停止。通过Microsoft管理控制台(MMC)控制台树中的图标显示每种服务的状态。
查询分析器
SQL查询分析器是交互式图形工具,它使数据库管理员或开发人员能够编写查询、同时执行多个查询、查看结果、分析查询计划和获得提高查询性能的帮助。
数据类型
精确数字
整数
bigint:从-2^63(-9223372036854775808)到2^63-1(9223372036854775807)的整型数据(所有数字)。int:从-2^31(-2,147,483,648)到2^31-1(2,147,483,647)的整型数据(所有数字)。smallint:从-2^15(-32,768)到2^15-1(32,767)的整数数据。tinyint:从0到255的整数数据。
Bit
bit:1或0的整数数据。
decimal和numeric
decimal:从-10^38+1到10^38–1的固定精度和小数位的数字数据。numeric:功能上等同于decimal。
money和smallmoney
money:货币数据值介于-2^63(-922,337,203,685,477.5808)与2^63-1(+922,337,203,685,477.5807)之间,精确到货币单位的千分之十。smallmoney:货币数据值介于-214,748.3648与+214,748.3647之间,精确到货币单位的千分之十。
近似数字
float:从-1.79E+308到1.79E+308的浮点精度数字。real:从-3.40E+38到3.40E+38的浮点精度数字。
datetime和smalldatetime
datetime从1753年1月1日到9999年12月31日的日期和时间数据,精确到百分之三秒(或3.33毫秒)。smalldatetime从1900年1月1日到2079年6月6日的日期和时间数据,精确到分钟。
字符串
char:固定长度的非Unicode字符数据,最大长度为8,000个字符。varchar:可变长度的非Unicode数据,最长为8,000个字符。text:可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。
Unicode字符串
nchar:固定长度的Unicode数据,最大长度为4,000个字符。
nvarchar:可变长度Unicode数据,其最大长度为4,000字符。sysname是系统提供用户定义的数据类型,在功能上等同于nvarchar(128),用于引用数据库对象名。ntext:可变长度Unicode数据,其最大长度为2^30-1(1,073,741,823)个字符。
二进制字符串
binary:固定长度的二进制数据,其最大长度为8,000个字节。varbinary:可变长度的二进制数据,其最大长度为8,000个字节。image:可变长度的二进制数据,其最大长度为2^31-1(2,147,
483,647)个字节。
其它数据类型
cursor:游标的引用。sql_variant:一种存储SQLServer支持的各种数据类型(text、ntext、timestamp和sql_variant除外)值的数据类型。table:一种特殊的数据类型,存储供以后处理的结果集。timestamp:数据库范围的唯一数字,每次更新行时也进行更新。uniqueidentifier:全局唯一标识符(GUID)。
CREATEDATABASE
创建一个新数据库及存储该数据库的文件,或从先前创建的数据库的文件中附加数据库。语法CREATEDATABASEdatabase_name[ON[
[,...n]][,[,...n]]][LOGON{[,...n]}][COLLATEcollation_name][FORLOAD|FORATTACH]::=[PRIMARY]([NAME=logical_file_name,]FILENAME='os_file_name'[,SIZE=size][,MAXSIZE={max_size|UNLIMITED}][,FILEGROWTH=growth_increment])[,...n]::=FILEGROUPfilegroup_name[,...n]
参数
database_name:新数据库的名称。数据库名
称在服务器中必须唯一,并且符合标识符的规则。ON:指定显式定义用来存储数据库数据部分的磁盘文件(数据文件)。该关键字后跟以逗号分隔的项列表,项用以定义主文件组的数据文件。主文件组的文件列表后可跟以逗号分隔的项列表(可选),用户文件组及其项用以定义用户文件组用户文件组文件。
n占位符,表示可以为新数据库指定多个文件。
LOGON:指定显式定义用来存储数据库日志的磁盘文件(日志文件)。该关键字后跟以逗号分隔的
项列表,项用以定义日志文件。如果没有指定LOGON,将自动创建一个日志文件,该文件使用系统生成的名称,大小为数据库中所有数据文件总大小的25%。
FORLOAD:支持该子句是为了与早期版本的MicrosoftSQLServer兼容。数据库在打
开dbouseonly数据库选项的情况下创建,并且将其状态设置为正在装载。Server7.0SQL
版中不需要该子句,因为RESTORE语句可以作为还原操作的一部分重新创建数据库。
FORATTACH:指定从现有的一组操作系统文件中附加数据库。
collation_name:指定数据库的默认排序规
则。排序规则名称既可以是Windows排序规则名称,也可以是SQL排序规
则名称。如果没有指定排序规则,则将SQLServer实例的默认排序规则指派为数据库的排序规则。有关Windows和SQL排序规则名称的更多信息,请参见COLLATE。
PRIMARY:指定关联的列表定义主文件。主文件组包含所有数据库系统表。还包含所有未指派给用
户文件组的对象。主文件组的第一个条目成为主文件,该文件包含数据库的逻辑起点及其系统表。
一个数据库只能有
一个主文件。如果没有指定PRIMARY,那么CREATEDATABASE语句中列出的第一个文件将成为主文件。
NAME:NAME:为由定义的文件指定逻辑名称。如果指定了FORATTACH,则不需要指定NAME参数。
logical_file_name:用来在创建数据库后logical_file_name:
执行的Transact-SQL语句中引用文件的名称。logical_file_name在数据库中必须唯一,并且符合标识符的规则。FILENAME:FILENAME:为定义的文件指定操作系统文件名。'os_file_name':操作系统创建定义的物理文件时使用的路径名和文件名。
如果文件在原始分区上创建,os_file_name必须只指定现有原始分区的驱动则器字母。每个原始分区上只能创建一个文件。原始分区上的文件不会自动增长;因此,os_file_name指定原始分区时,不需要指定MAXSIZE和FILEGROWTH参数。
SIZE:SIZE:指定中定义的文件的大小。如果主文件的中没有提供SIZE参数,那么SQLServer将
使用model数据库中的主文件大小。如果次要文件或日志文件的中没有指定SIZE参数,则SQLServer将使文件大小为1MB。中定义的文件的初始大小。可以使用千字节(KB)、兆字节(MB)、千兆字节(GB)或兆兆字节(TB)后缀。默认值为MB。指定一个整数,不要包含小数位。size的最小值为512KB。如果没有指定size,则默认值为1MB。为主文件指定的大小至少应与model数据库的主文件大小相同。
MAXSIZE:MAXSIZE:指定中定义的文件可以增长到的最大大小。
max_siz默认值为MB。指定一个整数,不要包含小数位。如果没有指定max_size,那么文件将增长到磁盘变满为止。
UNLIMITED:UNLIMITED:指定中定义的文件将增长到磁盘变满为止。FILEGROWTH:FILEGROWTH:指定中定义的文件的增长增量。文件的FILEGROWTH设置不能超过MAXSIZE设置。
growth_increment
每次需要新的空间时为文件添加的空间大小。指定一个整数,不要包含小数位。0值表示不增长。该值可以MB、KB、GB、TB或百分比(%)为单位指定。如果未在数量后面指定MB、KB或%,则默认值为MB则默认值为MB。如果指定%,则增量大小为发生增长时文件大小的指定百分比。如果没有指定FILEGROWTH,则默认值为10%,最小值为64KB。指定的大小舍入为最接近的64KB的倍数。
有三种类型的文件用来存储数据库:1.主文件主文件包含数据库的启动信息。主文件还可以用来存储数据。每个数据库都包含一个主文件。2.次要文件次要文件保存所有主要数据文件中容纳不下的数据。如果主文件大到足以容纳数据库中的所有数据,就不需要有次要数据文件。而
另一些数据库可能非常大,需要多个次要数据文件,也可能使用多个独立磁盘驱动器上的次要文件,以将数据分布在多个磁盘上。3.事务日志文件事务日志文件保存用来恢复数据库的日志信息。每个数据库必须至少有一个事务日志文件(尽管可以有多个)。
事务日志文件最小为512KB。
每个数据库至少有两个文件,一个主文件和一个事务日志文件。
文件类型主要数据文件次要数据文件事务日志文件.mdf.ndf.ldf
文件扩展名
创建指定数据文件和事务日志文件A.创建指定数据文件和事务日志文件的数据库
下面的示例创建名为Sales的数据库。因为没有使用关键字PRIMARY,第一个文件(Sales_dat成为主文件。因为Sales_dat文件的SIZE参数没有指定Sales_dat)Sales_datMB或KB,因此默认为MB,以兆字节为单位进行分配。Sales_log文件以兆字Sales_log节为单位进行分配,因为SIZE参数中显式声明了MB后缀。
USEmasterGOCREATEDATABASESalesON(NAME=Sales_dat,FILENAME='c:\programfiles\microsoftsqlserver\mssql\data\saledat.mdf',SIZE=10,MAXSIZE=50,FILEGROWTH=5)LOGON(NAME='Sales_log',FILENAME='c:\programfiles\microsoftsqlserver\mssql\data\salelog.ldf',
SIZE=5MB,MAXSIZE=25MB,FILEGROWTH=5MB)
GO
B.指定多个数据文件和事务日志文件创建数据库
下面的示例使用三个100MB的数据文件和两个100MB的事务日志文件创建了名为Archive的数据库。主文件是列表中的第一个文件,并使用PRIMARY关键字显式指定。事务日志文件在LOGON关键字后指定。注意FILENAME选项中所用的文件扩展名:主要数据文件使用.mdf,次要数据文件使用.ndf,事务日志文件使用.ldf。
USEmasterGOCREATEDATABASEArchiveONPRIMARY(NAME=Arch1,FILENAME='c:\programfiles\microsoftsqlserver\mssql\data\archdat1.mdf',SIZE=100MB,MAXSIZE=200,FILEGROWTH=20),(NAME=Arch2,FILENAME='c:\programfiles\microsoftsqlserver\mssql\data\archdat2.ndf',SIZE=100MB,MAXSIZE=200,FILEGROWTH=20),(NAME=Arch3,FILENAME='c:\programfiles\microsoftsqlserver\mssql\data\archdat3.ndf',SIZE=100MB,MAXSIZE=200,FILEGROWTH=20)LOGON(NAME=Archlog1,FILENAME='c:\programfiles\microsoftsqlserver\mssql\data\archlog1.ldf',SIZE=100MB,MAXSIZE=200,FILEGROWTH=20),(NAME=Archlog2,
FILENAME='c:\programfiles\microsoftsqlserver\mssql\data\archlog2.ldf',SIZE=100MB,MAXSIZE=200,FILEGROWTH=20)GO
C.创建简单的数据库
本例创建名为Products的数据库,并指定单个文件。指定的文件成为主文件,并会自动创建一个1MB的事务日志文件。因为主文件的SIZE参数中没有指定MB或KB,所以主文件将以兆字节为单位进行分配。因为没有为事务日志文件指定,所
以事务日志文件没有MAXSIZE,可以增长到填满所有可用的磁盘空间为止。
USEmasterGOCREATEDATABASEProductsON(NAME=prods_dat,FILENAME='c:\programfiles\microsoftsqlserver\mssql\data\prods.mdf',SIZE=4,MAXSIZE=10,FILEGROWTH=1)GO
D.不指定文件创建数据库
下面的示例创建名为mytest的数据库,并创建相应的主文件和事务日志文件。因为该语句没有项,所以主数据库文件的大小为model数据库主文件的大小。事务日志文件的大小为model数据库事务日志文件的大小。因为没有指定MAXSIZE,文件可以增长到填满所有可用的磁盘空间为止。
CREATEDATABASEmytest
E.不指定SIZE创建数据库
下面的示例创建名为products2的数据库。文件prods2_dat将成为主文件,大小等于model数据库中主文件的大小。事务日志文件会自动创建,其大小为主文件大小的25%或512KB中的较大值。因为没有指定MAXSIZE,文件可以增长到填满所有可用的磁盘空间为止。
USEmaster
GOCREATEDATABASEProducts2ON(NAME=prods2_dat,FILENAME='c:\programfiles\microsoftsqlserver\mssql\data\prods2.mdf')GO
F.使用文件组创建数据库
下面的示例使用三个文件组创建名为sales的数据库:
?
主文件组包含文件Spri1_dat和Spri2_dat。指定这些文件的FILEGROWTH增量为15%。名为SalesGroup1的文件组包含文件SGrp1Fi1和SGrp1Fi2。名为SalesGroup2的文件组包含文件SGrp2Fi1和SGrp2Fi2。
??
CREATEDATABASESalesONPRIMARY(NAME=SPri1_dat,FILENAME='c:\programfiles\microsoftsqlserver\mssql\data\SPri1dat.mdf',SIZE=10,MAXSIZE=50,FILEGROWTH=15%),(NAME=SPri2_dat,FILENAME='c:\programfiles\microsoftsqlserver\mssql\data\SPri2dt.ndf',SIZE=10,MAXSIZE=50,FILEGROWTH=15%),FILEGROUPSalesGroup1(NAME=SGrp1Fi1_dat,FILENAME='c:\programfiles\microsoftsqlserver\mssql\data\SG1Fi1dt.ndf',SIZE=10,MAXSIZE=50,FILEGROWTH=5),(NAME=SGrp1Fi2_dat,FILENAME='c:\programfiles\microsoftsqlserver\mssql\data\SG1Fi2dt.ndf',SIZE=10,MAXSIZE=50,FILEGROWTH=5),FILEGROUPSalesGroup2(NAME=SGrp2Fi1_dat,FILENAME='c:\programfiles\microsoftsqlserver\mssql\data\SG2Fi1dt.ndf',
SIZE=10,MAXSIZE=50,FILEGROWTH=5),(NAME=SGrp2Fi2_dat,FILENAME='c:\programfiles\microsoftsqlserver\mssql\data\SG2Fi2dt.ndf',SIZE=10,MAXSIZE=50,FILEGROWTH=5)LOGON(NAME='Sales_log',FILENAME='c:\programfiles\microsoftsqlserver\mssql\data\salelog.ldf',SIZE=5MB,MAXSIZE=25MB,FILEGROWTH=5MB)GO
创建文件组
在首次创建数据库,或者以后将更多文件添加到数据库时,可以创建文件组。但是,一旦将文件添加到数据库,就不可能再将这些文件移到其它文件组。一个文件不能是多个文件组的成员。表格、索引以及textntext和image数text
、ntext据可以与特定的文件组相关联。这意味着它们的所有页都将从该文件组的文件中分配。有三种类型的文件组:
?
主文件组
这些文件组包含主数据文件以及任何其它没有放入其它文件组的文件。系统表的所有页都从主文件组分配。
?
用户定义文件组
该文件组是用CREATEDATABASE或ALTERDATABASE语句中的FILEGROUP关键字,或在SQLServer企业管理器内的"属性"对话框上指定的任何文件组。
?
默认文件组
默认文件组包含在创建时没有指定文件组的所有表和索引的页。在每个数据库中,每次只能有一个文件组是默认文件组。如果没有指定默认文件组,则默认文件组是主文件组。
最多可以为每个数据库创建256个文件组。文件组只能包含数据文件。事务日志文件不能是文件组的一部分。
说明文件组不能独立于数据库文件创建。文件组是在数据库中对文件进行分组的一种管理机制。
G.附加数据库
示例B创建一个包含下列物理文件的名为Archive的数据库:
c:\programfiles\microsoftsqlserver\mssql\data\archdat1.mdfc:\programfiles\microsoftsqlserver\mssql\data\archdat2.ndfc:\programfiles\microsoftsqlserver\mssql\data\archdat3.ndfc:\programfiles\microsoftsqlserver\mssql\data\archlog1.ldfc:\programfiles\microsoftsqlserver\mssql\data\archlog2.ldf
可以使用sp_detach_db存储过程分离该数据库,然后使用带有FORATTACH子句的CREATEDATABASE重新附加。
sp_detach_dbArchiveGOCREATEDATABASEArchiveONPRIMARY(FILENAME='c:\programfiles\microsoftsqlserver\mssql\data\archdat1.mdf')FORATTACHGO
DROPDATABASE
从Microsoft?SQLServer?删除一个或多个数据库。删除数据库将删除数据库所使用的数据库文件和磁盘文件。
语法
DROPDATABASEdatabase_name[,...n]
示例
A.除去单个数据库
下例从系统表中删除publishing数据库的所有引用。
DROPDATABASEpublishing
B.除去多个数据库
下例从系统表中删除每个列出的数据库的所有引用。
DROPDATABASEpubs,newpubs
CREATETABLE
创建新表。
语法CREATETABLE[database_name.[owner].|owner.]table_name(
{
|column_nameAScomputed_column_expression|::=[CONSTRAINTconstraint_name]}|[{PRIMARYKEY|UNIQUE}[,...n]
)[ON{filegroup|DEFAULT}][TEXTIMAGE_ON{filegroup|DEFAULT}]::={column_namedata_type}[COLLATE][[DEFAULTconstant_expression]|[IDENTITY[(seed,increment)[NOTFORREPLICATION]]]][ROWGUIDCOL][][...n]
::=[CONSTRAINTconstraint_name]
{[NULL|NOTNULL]
|[{PRIMARYKEY|UNIQUE}[CLUSTERED|NONCLUSTERED][WITHFILLFACTOR=fillfactor][ON{filegroup|DEFAULT}]]]|[[FOREIGN
KEY]REFERENCESref_table[(ref_column)][ONDELETE{CASCADE|NOACTION}][ONUPDATE{CASCADE|NOACTION}][NOTFORREPLICATION]]|CHECK[NOTFORREPLICATION](logical_expression)
}
::=[CONSTRAINTconstraint_name]
{[{PRIMARYKEY|UNIQUE}
[CLUSTERED|NONCLUSTERED]
{(column[ASC|DESC][,...n])}
[WITHFILLFACTOR=fillfactor][ON{filegroup|DEFAULT}]]|FOREIGNKEY[(column[,...n])]REFERENCESref_table[(ref_column[,...n])][ONDELETE{CASCADE|NOACTION}][ONUPDATE{CASCADE|NOACTION}][NOTFORREPLICATION]|CHECK[NOTFORREPLICATION](search_conditions)
}
参数
database_name
是要在其中创建表的数据库名称。database_name必须是现有数据库的名称。如果不指定数据库,database_name默认为当前数据库。当前连接的登录必须在database_name所指定的数据库中有关联的现有用户ID,而该用户ID必须具有创建表的权限。
owner
是新表所有者的用户ID名,owner必须是database_name所指定的数据库中的现有用户ID,owner默认为与database_name所指定的数据库中的当前连接相关联的用户ID。如果CREATETABLE语句由sysadmin固定服务器角色成员或database_name所指定的数据库中的db_dbowner或db_ddladmin固定数据库角色成员执行,则owner可以指定与当前连接的登录相关联的用户ID以外的其它用户ID。如果与执行CREATETABLE语句的登录相关联的用户ID仅具有创建表的权限,owner必须指定与当前登录相关联的用户ID。sysadmin则sysadmin固定服务器角色成员或别名为dbo用户的登录与用户IDdbo相关联;因此,由这些用户创建的表的默认所有者为dbo不是由上述两种角色的登录创建的表dbo。所有者默认为与该登录相关联的用户ID。
table_name
是新表的名称。表名必须符合标识符规则。数据库中的owner.table_name组合必须唯一。table_name最多可包含128个字符,但本地临时表的表名(名称前有一个编号符#)最多只能包含116个字符。
column_name
是表中的列名。列名必须符合标识符规则,并且在表内唯一。以timestamp数据类型创建的列可以省略column_name。如果不指定column_name,timestamptimestamp列的名称默认为timestamptimestampstamp。
computed_column_expression
是定义计算列值的表达式。计算列是物理上并不存储在表中的虚拟列。计算列由同一表中的其它列通过表达式计算得到。例如,计算列可以这样定义:costAScostqty。表达式可以是非计算列的列名、常量、函数、变量,也可以是用price*qty一个或多个运算符连接的上述元素的任意组合。表达式不能为子查询。计算列可用于选择列表、WHERE子句、ORDERBY子句或任何其它可使用常规
表达式的位置,但下列情况除外:
?
计算列不能用作DEFAULT或FOREIGNKEY约束定义,也不能与NOTNULL约束定义一起使用。但是,如果计算列由具有确定性的表达式定义,并且索引列中允许计算结果的数据类型,则可将该列用作索引中的键列,或用作PRIMARYKEY或UNIQUE约束的一部分。
例如,如果表中含有整型列a和b,则可以在计算列a+b上创建索引。但不能在计算列a+DATEPART(dd,GETDATE())上创建索引,因为在以后的调用中,其值可能发生改变。
?
计算列不能作为INSERT或UPDATE语句的目标。
说明表中计算列所使用的列值因行而异,因此每行的计算列值可能不同。计算列的为空性是由SQLServer根据使用的表达式自动确定的。即使只有不可为空的列,大多数表达式的结果也认为是可为空的,因为可能的下溢或溢出也将生成NULL结果。使用COLUMNPROPERTY函数(AllowsNull属性)查看表中任何计算列的为空性。通过指定ISNULL(check_expression,constant),其中常量为替代任何NULL结果的非NULL值,可为空的表达式expr可以转换为不可为空的表达式。ON{filegroup|DEFAULT}指定存储表的文件组。如果指定filegroup,则表将存储在指定的文件组中。数据库中必须存在该文件组。如果指定DEFAULT,或者根本未指定ON参数,则表存储在默认文件组中。ON{filegroup|DEFAULT}也可以在PRIMARYKEY约束或UNIQUE约束中指定。这些约束会创建索引。如果指定filegroup,则索引将存储在指定的文件组中。如果指定DEFAULT,则索引将存储在默认文件组中。如果约束中没有指定文件组,则索引将与表存储在同一文件组中。如果PRIMARYKEY约束或UNIQUE约束创建聚集索引,则表的数据页将与索引存储在同一文件组中。
说明在ON{filegroup|DEFAULT}和TEXTIMAGE_ON{filegroup|DEFAULT}的上下文中,DEFAULT并不是关键字。DEFAULT是默认文件组的标识符并需对其进行定界,如ON"DEFAULT"、ON[DEFAULT]和TEXTIMAGE_ON"DEFAULT"或TEXTIMAGE_ON[DEFAULT]。TEXTIMAGE_ON是表示textntext和image列存储在指定文件组中的关键字。text、ntext如果表中没有text、ntexttextntext或image列,则不能使用TEXTIMAGEON。如果没有指定TEXTIMAGE_ON,则textntext和image列将与表存储在同一文件组中。text、ntext
data_type
指定列的数据类型。可以是系统数据类型或用户定义数据类型。用户定义数据类型必须先用sp_addtype创建,然后才能在表定义中使用。在CREATETABLE语句中,用户定义数据类型的NULL/NOTNULL赋值可被替代。但长度标准不能更改;不能在CREATETABLE语句中指定用户定义数据类型的长度。DEFAULT
如果在插入过程中未显式
提供值,则指定为列提供的值。DEFAULT定义可适用于除定义为timestamp或带IDENTITY属性的列以外的任何列。除去表时,将删除DEFAULT定义。只有常量值(如字符串)、系统函数(如SYSTEM_USER())或NULL可用作默认值。为保持与SQLServer早期版本的兼容,可以给DEFAULT指派约束名。
constant_expression
是用作列的默认值的常量、NULL或系统函数。IDENTITY表示新列是标识列。当向表中添加新行时,Microsoft?SQLServer?将为该标识列提供一个唯一的、递增的值。标识列通常与PRIMARYKEY约束一起用作表的唯一行标识符。可以将IDENTITY属性指派给tinyintsmallintinttinyint、smallint、intsmallintint、bigint、对于每个表只能创建一个标识列。bigint、decimal(p,0)或numeric(p,0)列。不能对标识列使用绑定默认值和DEFAULT约束。必须同时指定种子和增量,或者二者都不指定。如果二者都未指定,则取默认值(1,1)。
seed
是装入表的第一行所使用的值。
increment
是添加到前一行的标识值的增量值。NOTFORREPLICATION表示当复制登录(如sqlreplsqlrepl)向表中插入数据时,不强制IDENTITY属性。复制的行必须保留发布数据库中所赋予的键值;NOTFORREPLICATION子句确保不向复制进程所插入的行赋予新的标识值。其它登录所插入的行仍然具有以通常的方式创建的新标识值。建议同时使用具有NOTFORREPLICATION的CHECK约束,以确保赋予的标识值处于当前数据库所需的范围内。ROWGUIDCOL表示新列是行的全局唯一标识符列。对于每个表只能指派一个uniqueidentifier列作为ROWGUIDCOL列。ROWGUIDCOL属性只能指派给如果数据库兼容级别小于或等于65,ROWGUIDCOL关则uniqueidentifier列。键字无效。有关更多信息,请参见sp_dbcmptlevel。ROWGUIDCOL属性并不强制列中所存储值的唯一性。该属性也不会为插入到表中的新行自动生成值。若要为每列生成唯一值,那么或者在INSERT语句中使用NEWID函数,或者将NEWID函数指定为该列的默认值。
collation_name
指定列的排序规则。排序规则名称既可以是Windows排序规则名称,也可以是SQL排序规则名称。collation_name仅适用于数据类型为charvarchartextchar、varchar、text、nchar、nvarcharncharnvarchar及ntext的列。如果没有指定该参数,那么如果列的数据类型是用户定义的,则该列的排序规则就是用户定义数据类型的排序规则,否则就是数据库的默认排序规则。有关Windows和SQL排序规则名称的更多信息,请参见COLLATE。CONSTRAINT是可选关键字,表示PRIMARYKEY、NOTNULL、UNIQUE、FOREIGNKEY或CHECK约束定义的开始。约束是特殊属性,用于强制数据完整性并可以为表
及其列创建索引。
constrain_name
是约束的名称。约束名在数据库内必须是唯一的。NULL|NOTNULL是确定列中是否允许空值的关键字。从严格意义上讲,NULL不是约束,但可以使用与指定NOTNULL同样的方法指定。PRIMARYKEY是通过唯一索引对给定的一列或多列强制实体完整性的约束。对于每个表只能创建一个PRIMARYKEY约束。UNIQUE是通过唯一索引为给定的一列或多列提供实体完整性的约束。一个表可以有多个UNIQUE约束。CLUSTERED|NONCLUSTERED是表示为PRIMARYKEY或UNIQUE约束创建聚集或非聚集索引的关键字。PRIMARYKEY约束默认为CLUSTERED,UNIQUE约束默认为NONCLUSTERED。在CREATETABLE语句中只能为一个约束指定CLUSTERED。如果在为UNIQUE约束指定CLUSTERED的同时又指定了PRIMARYKEY约束,则PRIMARYKEY将默认为NONCLUSTERED。[WITHFILLFACTOR=fillfactor]
指定SQLServer存储索引数据时每个索引页的充满程度。用户指定的fillfactor取值范围从1到100。如果没有指定fillfactor,则默认为0。创建索引时,fillfactor的值越低,不必分配新空间即可由新索引项使用的空间就越多。FOREIGNKEY......REFERENCES...是为列中的数据提供引用完整性的约束。FOREIGNKEY约束要求列中的每个值在被引用表中对应的被引用列中都存在。FOREIGNKEY约束只能引用被引用表中为PRIMARYKEY或UNIQUE约束的列或被引用表中在UNIQUEINDEX内引用的列。
ref_table
是FOREIGNKEY约束所引用的表名。(ref_column[,...n]),)是FOREIGNKEY约束所引用的表中的一列或多列。ONDELETE{CASCADE|NOACTION}指定当要创建的表中的行具有引用关系,并且从父表中删除该行所引用的行时,要对该行采取的操作。默认设置为NOACTION。如果指定CASCADE,则从父表中删除被引用行时,也将从引用表中删除引用行。如果指定NOACTION,SQLServer将产生一个错误并回滚父表中的行删除操作。例如,在Northwind数据库中,Orders表和Customers表之间有引用关系。OrdersOrders.CustomerID外键引用Customers.CustomerID主键。如果对Customers表的某行执行DELETE语句,并且为Orders.CustomerID指定ONDELETECASCADE操作,则SQLServer将在Orders表中检查是否有与被删除的行相关的一行或多行。如果存在相关行,Orders表中的相关行将随则Customers表中的被引用行一同删除。反之,如果指定NOACTION,若在Orders表中至少有一行引用Customers表中要删除的行,则SQLServer将产生一个错误并回滚Customers表中的删除操作。ONUPDATE{CASCADE|NOACTION}指定当要创建的表中的行具有引用关系,并且在父表中更新该行所引用的行时,要对该行采取的操作。默认设置为NOACT
ION。如果指定CASCADE,则在父表中更新被引用行时,也将在引用表中更新引用行。如果指定NOACTION,SQLServer将产生一个错误并回滚父表中的行更新操作。
例如,在Northwind数据库中,Orders表和Customers表之间有引用关系:OrdersCustomers.CustomerIDOrders.CustomerID外键引用Customers.CustomerID主键。如果对Customers表的某行执行UPDATE语句,并且为Orders.CustomerID指定ONUPDATECASCADE操作,则SQLServer将在Orders表中检查是否有与被更新行相关的一行或多行。如果存在相关行,则Orders表中的相关行将随Customers表中的被引用行一同更新。反之,如果指定NOACTION,若在Orders表中至少有一行引用Customers行,则SQLServer将产生一个错误并回滚对Customers行的更新操作。CustomersCHECK是通过限制可输入到一列或多列中的可能值强制域完整性的约束。NOTFORREPLICATION是用于防止在复制所使用的分发过程中强制CHECK约束的关键字。当表是复制发布的订户时,请不要直接更新订阅表,而要更新发布表,然后让复制进程将数据分发回订阅表。可以在订阅表上定义CHECK约束,以防用户修改订阅表。但是如果不使用NOTFORREPLICATION子句,CHECK约束同样会防止复制进程将修改从发布表分发给订阅表。NOTFORREPLICATION子句表示对用户的修改(而不是对复制进程)强加约束。NOTFORREPLICATIONCHECK约束适用于被更新记录的前像和后像,以防在复制范围中添加记录或从复制范围中删除记录。将检查所有删除和插入操作;如果操作在复制范围内,则拒绝执行该操作。如果对标识符列使用此约束,则当复制用户更新标识列时,SQLServer将允许不必重新计算表标识列的种子值。
logical_expression
是返回TRUE或FALSE的逻辑表达式。
column
是用括号括起来的一列或多列,在表约束中表示这些列用在约束定义中。[ASC|DESC]指定加入到表约束中的一列或多列的排序次序。默认设置为ASC。
n
是表示前面的项可重复n次的占位符。
注释
SQLServer的每个数据库最多可存储20亿个表,每个表可以有1024列。表的行数及总大小仅受可用存储空间的限制。每行最多可以存储8,060字节。如果创建具有varcharnvarchar或varbinary列的表,varchar、并且列的字节总数超过8,060字节,虽然仍可以创建此表,但会出现警告信息。如果试图插入超过8,060字节的行或对行进行更新以至字节总数超过8,060,将出现错误信息并且语句执行失败。包含sql_variant列的CREATETABLE语句可以生成下列警告:
Thetotalrowsize(xx)fortable'yy'exceedsthemaximumnumberofbytesperrow(8060).Rowsthatexceedthemaximumnumberofbytes
willnotbeadded.
出现该警告是因为sql_variant的最大长度只能为8016字节。当某个sql_variant列包含与最大长度接近的值时,它可以超过行的最大大小限制。每个表最多可以有249个非聚集索引和一个聚集索引。其中包括所有为支持表中所定义的PRIMARYKEY和UNIQUE约束而生成的索引。SQLServer在列定义中并不强制以特定的顺序指定DEFAULT、IDENTITY、ROWGUIDCOL或列约束。
临时表
可以创建本地和全局临时表。本地临时表仅在当前会话中可见;全局临时表在所有会话中都可见。本地临时表的名称前面有一个编号符(#table_name),而全局临时表的名称前面有两个编号符(##table_name)。SQL语句使用CREATETABLE语句中为table_name指定的名称引用临时表:
CREATETABLE#MyTempTable(colaINTPRIMARYKEY)INSERTINTO#MyTempTableVALUES(1)
如果本地临时表由存储过程创建或由多个用户同时执行的应用程序创建,SQL则Server必须能够区分由不同用户创建的表。为此,SQLServer在内部为每个本地临时表的表名追加一个数字后缀。存储在tempdb数据库的sysobjects表中的临时表,其全名由CREATETABLE语句中指定的表名和系统生成的数字后缀组成。为了允许追加后缀,为本地临时表指定的表名table_name不能超过116个字符。除非使用DROPTABLE语句显式除去临时表,否则临时表将在退出其作用域时由系统自动除去:
?
当存储过程完成时,将自动除去在存储过程中创建的本地临时表。由创建表的存储过程执行的所有嵌套存储过程都可以引用此表。但调用创建此表的存储过程的进程无法引用此表。所有其它本地临时表在当前会话结束时自动除去。全局临时表在创建此表的会话结束且其它任务停止对其引用时自动除去。任务与表之间的关联只在单个Transact-SQL语句的生存周期内保持。换言之,当创建全局临时表的会话结束时,最后一条引用此表的Transact-SQL语句完成后,将自动除去此表。
??
在存储过程或触发器中创建的本地临时表与在调用存储过程或触发器之前创建的同名临时表不同。如果查询引用临时表,而同时有两个同名的临时表,则不定义针对哪个表解析该查询。嵌套存储过程同样可以创建与调用它的存储过程所创建的临时表同名的临时表。嵌套存储过程中对表名的所有引用都被解释为是针对该嵌套过程所创建的表,例如:
CREATEPROCEDURETest2ASCREATETABLE#t(xINTPRIMARYKEY)INSERTINTO#tVALUES(2)SELECTTest2Col=xFROM#tGOCREATEPROCEDURETest1ASCREATETABLE#t(xINTPRIMARYKEY)INSERTINTO#tVALUES(1)SELECTTest1Col=xFROM#tEXECTest2GOCREATETABLE#t(xINTPRIMARYKEY)INSERTINTO#tVALUES(99)GO
EXECTest1GO
下面是结果集:
(1row(s)affected)Test1Col----------1(1row(s)affected)
Test2Col----------2
当创建本地或全局临时表时,CREATETABLE语法支持除FOREIGNKEY约束以外的其它所有约束定义。如果在临时表中指定FOREIGNKEY约束,该语句将返回警告信息,指出此约束已被忽略,表仍会创建,但不具有FOREIGNKEY约束。在FOREIGNKEY约束中不能引用临时表。考虑使用表变量而不使用临时表。当需要在临时表上显式地创建索引时,或多个存储过程或函数需要使用表值时,临时表很有用。通常,表变量提供更有效的查询处理。有关更多信息,请参见table。
PRIMARYKEY约束
??
一个表只能包含一个PRIMARYKEY约束。由PRIMARYKEY约束生成的索引不能使表中的非聚集索引超过249个,聚集索引超过1个。如果没有在PRIMARYKEY约束中指定CLUSTERED或NONCLUSTERED,并且没有为UNIQUE约束指定聚集索引,则将对该PRIMARYKEY约束使用CLUSTERED。在PRIMARYKEY约束中定义的所有列都必须定义为NOTNULL。如果没有指定为空性,加入PRIMARYKEY约束的所有列的为空性都将设置为NOTNULL。
?
?
UNIQUE约束
?
如果UNIQUE约束中没有指定CLUSTERED或NONCLUSTERED,则默认为NONCLUSTERED。每个UNIQUE约束都生成一个索引。由UNIQUE约束生成的索引不能使表中的非聚集索引超过249个,聚集索引超过1个。
?
FOREIGNKEY约束
?
如果在FOREIGNKEY约束的列中输入非NULL值,则此值必须在被引用的列中存在,否则将返回违反外键约束的错误信息。FOREIGNKEY约束应用于前面所讲的列,除非指定了源列。FOREIGNKEY约束仅能引用位于同一服务器上的同一数据库中的表。数据库间的引用完整性必须通过触发器实现。有关更多信息,请参见CREATETRIGGER。FOREIGNKEY可以引用同一表中的其它列(自引用)。
??
?
?
列级FOREIGNKEY约束的REFERENCES子句仅能列出一个引用列,且该列必须与定义约束的列具有相同的数据类型。表级FOREIGNKEY约束的REFERENCES子句中引用列的数目必须与约束列列表中的列数相同。每个引用列的数据类型也必须与列表中相应列的数据类型相同。如果timestamp类型的列是外键或被引用键的一部分,则不能指定CASCADE。可以在相互间具有引用关系的表上组合使用CASCADE和NOACTION。如果SQLServer遇到NOACTION,将终止执行语句并回滚相关的CASCADE操作。当DELETE语句导致CASCADE和NOACTION组合操作时,SQLServer检在查NOACTION操作之前将执行所有CASCADE操作。一个表最多可包含253个FOREIGNKEY约束。对于临时表不强制FOREIGNKEY约束。每个表在其FOREIGNKEY约束中最
多可以引用253个不同的表。FOREIGNKEY约束只能引用被引用表的PRIMARYKEY或UNIQUE约束中的列或被引用表上UNIQUEINDEX中的列。
?
??
????
DEFAULT定义
??
每列只能有一个DEFAULT定义。DEFAULT定义可以包含常量值、函数、SQL-92niladic函数或NULL。下表显示niladic函数及其在执行INSERT语句时返回的默认值。SQL-92niladic函数CURRENT_TIMESTAMPCURRENT_USERSESSION_USERSYSTEM_USERUSER返回的值当前日期和时间。执行插入操作的用户名。执行插入操作的用户名。执行插入操作的用户名。执行插入操作的用户名。
??
DEFAULT定义中的constant_expression不能引用表中的其它列,也不能引用其它表、视图或存储过程。不能在数据类型为timestamp的列或具有IDENTITY属性的列上创建DEFAULT定义。如果用户定义数据类型绑定到默认对象,则不能在该用户定义数据类型的列上创建DEFAULT定义。
?
?
CHECK约束
?
列可以有任意多个CHECK约束,并且约束条件中可以包含用AND和OR组合起来的多个逻辑表达式。列上的多个CHECK约束按创建顺序进行验证。搜索条件必须取值为布尔表达式,并且不能引用其它表。列级CHECK约束只能引用被约束的列,表级CHECK约束只能引用同一表中的列。
??
当执行INSERT和DELETE语句时,CHECKCONSTRAINTS和规则具有相同的数据验证功能。
?
当列上存在规则和一个或多个CHECK约束时,将验证所有限制。
其它约束信息
?
为约束创建的索引不能用DROPINDEX语句除去;必须用ALTERTABLE语句除去约束。可以用DBCCDBREINDEX语句重建为约束创建的并由其使用的索引。约束的名称必须符合标识符规则,但其名称的首字符不能为#。如果没有提供constraint_name,则使用系统生成的名称。约束名将出现在所有与违反约束有关的错误信息中。当INSERT、UPDATE或DELETE语句违反约束时,将终止执行该语句。但将继续处理事务(如果此语句为显式事务的组成部分)可以通过检查系统函数。@@ERROR,在事务定义中使用ROLLBACKTRANSACTION语句。
?
?
如果某个表具有FOREIGNKEY或CHECKCONSTRAINTS及触发器,则将在触发器执行前先检查约束条件。若要获得关于表及其列的报表,请使用sp_help或sp_helpconstraintsp_helpconstraint。若要重命名表,请使用sp_renamesp_rename。若要获得与表相关的视图和存储过程的报表,请使用sp_dependssp_depends。通常情况下,为表和索引分配空间时,每次以一个扩展盘区为增量单位。当创建表或索引时,首先从混合扩展盘区为其分配页,直到它具有足够的页填满一个统一扩展盘区。当有足够的页填满统一扩展
盘区后,每当当前分配的扩展盘区填满时,将再为其分配另一个扩展盘区。若要获得关于由表分配和占用的空间量的报表,请执行sp_spaceusedsp_spaceused。
表定义中的为空性规则
列的为空性规则决定该列中是否允许以空值(NULL)作为其数据。NULL不是零或空白:它表示没有输入任何内容,或提供了一个显式NULL值,通常表示该值未知或不适用。
当用CREATETABLE或ALTERTABLE语句创建或更改表时,数据库或会话设置会影响且可能替代列定义中数据类型的为空性。建议始终将列显式定义为非计算列的NULL或NOTNULL,如果使用用户定义数据类型,则建议允许该列使用此数据类型的默认为空性。在没有显式指定时,列的为空性遵循以下规则:
?
?
如果该列以用户定义数据类型定义:?SQLServer使用在创建数据类型时指定的为空性。使用sp_help可获得该数据类型的默认为空性。如果该列以系统提供的数据类型定义:?如果系统提供的数据类型只有一个选项,则优先使用该选项。timestamp数据类型只能定义为NOTNULL。
?
如果sp_dbcmptlevel的设置是65或更小,且列没有显式定义NULL或NOTNULL,则bit数据类型默认为NOTNULL。有关更多信息,请参见sp_dbcmptlevel。如果有任何会话设置为ON(用SET语句打开),那么:
?
如果ANSI_NULL_DFLT_ON是ON,则指派NULL。如果ANSI_NULL_DFLT_OFF是ON,则指派NOTNULL。
?
如果配置了任何数据库设置(用sp_dboption更改),那么:
如果ANSInulldefault为truedefaulttrue,则指派NULL。如果ANSInulldefault为falsefalse,则指派NOTNULL。
?
当会话的两个ANSI_NULL_DFLT选项都未设置,且数据库设置为默认值(ANSInulldefault为false)时,将指派SQLServer的默认设置NOTNULL。如果该列是计算列,则其为空性总是由SQLServer自动确定。使用COLUMNPROPERTY函数(AllowsNull属性)查找这类列的为空性。
?
说明默认情况下,SQLServerODBC驱动程序和用于SQLServer的MicrosoftOLEDB提供程序都将ANSI_NULL_DFLT_ON设置为ON。ODBC和OLEDB用户可以在ODBC数据源中配置该设置,或通过应用程序设置的连接特性或属性配置该设置。
权限
CREATETABLE权限默认授予db_owner和db_ddladmin固定数据库角色成员。db_owner固定数据库角色成员和sysadmin固定服务器角色成员可以将CREATETABLE权限转让给其他用户。
示例
A.使用PRIMARYKEY约束
下例显示在示例数据库pubs的jobs表中,job_id列中具有聚集索引的job_idPRIMARYKEY约束的列定义;此例由系统提供约束名。
job_idsmallintPRIMARYKEYCLUSTERED
下例显示如何为PRIMARYKEY约束提供名称。此约
束用于employee表中的emp_id列。此列基于用户定义数据类型。
emp_idempidCONSTRAINTPK_emp_idPRIMARYKEYNONCLUSTERED
B.使用FOREIGNKEY约束
FOREIGNKEY约束用于引用其它表。FOREIGNKEY可以是单列键或多列键。下例显示employee表上引用jobs表的单列FOREIGNKEY约束。对于单列FOREIGNKEY约束,只需要REFERENCES子句。
job_idsmallintDEFAULT1REFERENCESjobs(job_id)NOTNULL
也可以显式使用FOREIGNKEY子句并复述列特性。注意在这两个表中列名不必相同。
FOREIGNKEY(job_id)REFERENCESjobs(job_id)
多列键约束作为表约束创建。在pubs数据库中,sales表包含多列PRIMARYsalesKEY。下例显示如何从其它表中引用此键(可选择显式约束名)。
CONSTRAINTFK_sales_backorderFOREIGNKEY(stor_id,ord_num,title_id)REFERENCESsales(stor_id,ord_num,title_id)
C.使用UNIQUE约束
UNIQUE约束用于强制非主键列的唯一性。PRIMARYKEY约束列自动包含唯一性限制;但是,UNIQUE约束允许存在空值。下例显示表authors中名为pseudonym的列。该列强制作者笔名必须唯一。
pseudonymvarchar(30)UNIQUENONCLUSTERED
NULL
下例显示在stor_id实际上是PRIMARYKEY的stores表中,stor_name列和city列上创建的UNIQUE约束;同一个城市中的商店不应同名。
CONSTRAINTU_storeUNIQUENONCLUSTERED(stor_name,city)
D.使用DEFAULT定义
使用INSERT和UPDATE语句时,如果没有提供值,则默认值会提供值。pubs在数据库中,使用了许多DEFAULT定义以确保输入有效的数据或占位符。在jobs表上,当没有显式输入实际的描述信息时,默认的字符串将提供描述信息(列job_descjob_desc)。
DEFAULT'NewPosition-titlenotformalizedyet'
在employee表中,员工可以受雇于子公司或母公司。如果没有显式提供公司信息,则输入母公司(注意在表定义中可以嵌套注释,如下所示)。
DEFAULT('9952')/*BydefaulttheParentCompanyPublisheristhecompanytowhomeachemployeereports.*/
除了常量以外,DEFAULT定义还可以包含函数。使用下例获取输入项的当前日期:
DEFAULT(getdate())
niladic函数也可以提高数据的完整性。若要跟踪插入行的用户,请使用niladic函数USER(niladic函数不使用括号):
DEFAULTUSER
E.使用CHECK约束
下例显示对输入到jobs表中的min_lvl列和max_lvl列的值的限制。这两个约束都未命名:
CHECK(min_lvl>=10)
与
CHECK(max_lvl<=250)
下例显示对输入到employee表的emp_id列中的字符数据具有模式限制的命名约束。
CONSTRAINTCK_emp_idCHECK(emp_idLIKE'[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]'ORemp_idLIKE'[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]')
下例指定pub_id必须在特定的列表中或遵循给定的模式。此约束用于publishers
表中的pub_id列。
CHECK(pub_idIN('1389','0736','0877','1622','1756')ORpub_idLIKE'99[0-9][0-9]')
F.完整的表定义
下例显示pubs数据库中所创建的三个表(jobs、employee和publishersjobs、publishers)的jobs完整表定义,其中包含所有的约束定义。
/***************************jobstable***************************/CREATETABLEjobs(job_idsmallintIDENTITY(1,1)PRIMARYKEYCLUSTERED,job_descvarchar(50)NOTNULLDEFAULT'NewPosition-titlenotformalizedyet',min_lvltinyintNOTNULLCHECK(min_lvl>=10),max_lvltinyintNOTNULLCHECK(max_lvl<=250))/**************************employeetable**************************/CREATETABLEemployee(emp_idempidCONSTRAINTPK_emp_idPRIMARYKEYNONCLUSTEREDCONSTRAINTCK_emp_idCHECK(emp_idLIKE'[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]'oremp_idLIKE'[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'),/*EachemployeeIDconsistsofthreecharactersthatrepresenttheemployee'sinitials,followedbyafivedigitnumberrangingfrom10000through99999andthentheemployee'sgender(MorF).A(hyphen)-isacceptableforthemiddleinitial.*/
fnameminitlnamejob_id
varchar(20)char(1)NULL,varchar(30)smallint
NOTNULL,NOTNULL,NOTNULL
DEFAULT1/*Entryjob_idfornewhires.*/REFERENCESjobs(job_id),job_lvltinyintDEFAULT10,/*Entryjob_lvlfornewhires.*/pub_idchar(4)NOTNULLDEFAULT('9952')REFERENCESpublishers(pub_id),/*Bydefault,theParentCompanyPublisheristhecompanytowhomeachemployeereports.*/hire_datedatetimeNOTNULLDEFAULT(getdate())/*Bydefault,thecurrentsystemdateisentered.*/)/******************publisherstable*********************/CREATETABLEpublishers(pub_idchar(4)NOTNULLCONSTRAINTUPKCL_pubindPRIMARYKEYCLUSTEREDCHECK(pub_idIN('1389','0736','0877','1622','1756')ORpub_idLIKE'99[0-9][0-9]'),pub_namecitystatecountry)
G.在列中使用uniqueidentifier数据类型
varchar(40)varchar(20)char(2)NULL,varchar(30)DEFAULT('USA')
NULL,NULL,NULL
下例创建含有uniqueidentifier列的表。该表使用PRIMARYKEY约束以确保用户不会在表中插入重复的值,并在DEFAULT约束中使用NEWID()函数为新行提供值。
CREATETABLEGlobally_Unique_Data(guiduniqueidentifierCONSTRAINTGuid_DefaultDEFAULTNEWID(),Employee_Namevarchar(60),
CONSTRAINTGuid_PKPRIMARYKEY(Guid))
H.对计算列使用表达式
下例显示如何使用表达式((low+high/2计算myavg计算列。lowhigh)/2/2)
CREATETABLEmytable(lowint,highint,myavgAS(low+high)/2)
I.对计算列使用USER_NAME函数
下例在myuser_name列中使用USER_NAME函数。
CREATETABLEmylogintable(date_indatetime,user_idint,myuser_nameASUSER_NAME())
J.使用NOTFORREPLICATION
下例显示如何在订阅了复制的表中使用IDENTITY属性。此表包含CHECK约束,以确保此系统生成的
SaleID值不会增长到为复制发布服务器指派的范围内。
CREATETABLESales(SaleIDINTIDENTITY(100000,1)NOTFORREPLICATION,CHECKNOTFORREPLICATION(SaleID<=199999),SalesRegionCHAR(2),CONSTRAINTID_PKPRIMARYKEY(SaleID))