SQL建表命令理解

CREATE TABLE

[ database_name.[ owner ] .| owner.] table_name

( { < column_definition >

| column_name AS computed_column_expression

| < table_constraint > ::= [ CONSTRAINT constraint_name ] }

| [ { PRIMARY KEY | UNIQUE } [ ,...n ]

)

[ ON { filegroup | DEFAULT } ]

[ TEXTIMAGE_ON { filegroup | DEFAULT } ]

< column_definition > ::= { column_name data_type }

[ COLLATE < collation_name > ]

[ [ DEFAULT constant_expression ]

| [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]

]

[ ROWGUIDCOL]

[ < column_constraint > ] [ ...n ]

< column_constraint > ::= [ CONSTRAINT constraint_name ]

{ [ NULL | NOT NULL ]

| [ { PRIMARY KEY | UNIQUE }

[ CLUSTERED | NONCLUSTERED ]

[ WITH FILLFACTOR = fillfactor ]

[ON {filegroup | DEFAULT} ] ]

]

| [ [ FOREIGN KEY ]

REFERENCES ref_table [ ( ref_column ) ]

[ ON DELETE { CASCADE | NO ACTION } ]

[ ON UPDATE { CASCADE | NO ACTION } ]

[ NOT FOR REPLICATION ]

]

| CHECK [ NOT FOR REPLICATION ]

( logical_expression )

}

< table_constraint > ::= [ CONSTRAINT constraint_name ]

{ [ { PRIMARY KEY | UNIQUE }

[ CLUSTERED | NONCLUSTERED ]

{ ( column [ ASC | DESC ] [ ,...n ] ) }

[ WITH FILLFACTOR = fillfactor ]

[ ON { filegroup | DEFAULT } ]

]

| FOREIGN KEY

[ ( column [ ,...n ] ) ]

REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]

[ ON DELETE { CASCADE | NO ACTION } ]

[ ON UPDATE { CASCADE | NO ACTION } ]

[ NOT FOR REPLICATION ]

| CHECK [ NOT FOR REPLICATION ]

( search_conditions )

}


最佳答案:

参数

database_name

是要在其中创建表的数据库名称database_name 必须是现有数据库的名称如果不指定数据库,database_name 默认为当前数据库当前连接的登录必须在 database_name 所指定的数据库中有关联的现有用户 ID,而该用户 ID 必须具有创建表的权限

owner

是新表所有者的用户 ID 名,owner 必须是 database_name 所指定的数据库中的现有用户 ID,owner 默认为与 database_name 所指定的数据库中的当前连接相关联的用户 ID如果 CREATE TABLE 语句由 sysadmin 固定服务器角色成员或 database_name 所指定的数据库中的 db_dbowner 或 db_ddladmin 固定数据库角色成员执行,则 owner 可以指定与当前连接的登录相关联的用户 ID 以外的其它用户 ID如果与执行 CREATE TABLE 语句的登录相关联的用户 ID 仅具有创建表的权限,则 owner 必须指定与当前登录相关联的用户 IDsysadmin 固定服务器角色成员或别名为 dbo 用户的登录与用户 ID dbo 相关联;因此,由这些用户创建的表的默认所有者为 dbo不是由上述两种角色的登录创建的表所有者默认为与该登录相关联的用户 ID

table_name

是新表的名称表名必须符合标识符规则数据库中的 owner.table_name 组合必须唯一table_name 最多可包含 128 个字符,但本地临时表的表名(名称前有一个编号符 #)最多只能包含 116 个字符

column_name

是表中的列名列名必须符合标识符规则,并且在表内唯一以 timestamp 数据类型创建的列可以省略 column_name如果不指定 column_name,timestamp 列的名称默认为 timestamp

computed_column_expression

是定义计算列值的表达式计算列是物理上并不存储在表中的虚拟列计算列由同一表中的其它列通过表达式计算得到例如,计算列可以这样定义:cost AS price * qty表达式可以是非计算列的列名、常量、函数、变量,也可以是用一个或多个运算符连接的上述元素的任意组合表达式不能为子查询

计算列可用于选择列表、WHERE 子句、ORDER BY 子句或任何其它可使用常规表达式的位置,但下列情况除外:

计算列不能用作 DEFAULT 或 FOREIGN KEY 约束定义,也不能与 NOT NULL 约束定义一起使用但是,如果计算列由具有确定性的表达式定义,并且索引列中允许计算结果的数据类型,则可将该列用作索引中的键列,或用作 PRIMARY KEY 或 UNIQUE 约束的一部分

例如,如果表中含有整型列 a 和 b,则可以在计算列 a+b 上创建索引但不能在计算列 a+DATEPART(dd, GETDATE()) 上创建索引,因为在以后的调用中,其值可能发生改变

计算列不能作为 INSERT 或 UPDATE 语句的目标

说明   表中计算列所使用的列值因行而异,因此每行的计算列值可能不同

计算列的为空性是由 SQL Server 根据使用的表达式自动确定的即使只有不可为空的列,大多数表达式的结果也认为是可为空的,因为可能的下溢或溢出也将生成 NULL 结果使用 COLUMNPROPERTY 函数(AllowsNull 属性)查看表中任何计算列的为空性通过指定 ISNULL(check_expression, constant),其中常量为替代任何 NULL 结果的非 NULL 值,可为空的表达式 expr 可以转换为不可为空的表达式

ON {filegroup | DEFAULT}

指定存储表的文件组数据库中必须存在该文件组如果指定 DEFAULT,或者根本未指定 ON 参数,则表存储在默认文件组中

ON {filegroup | DEFAULT} 也可以在 PRIMARY KEY 约束或 UNIQUE 约束中指定这些约束会创建索引如果指定 filegroup,则索引将存储在指定的文件组中如果指定 DEFAULT,则索引将存储在默认文件组中如果约束中没有指定文件组,则索引将与表存储在同一文件组中如果 PRIMARY KEY 约束或 UNIQUE 约束创建聚集索引,则表的数据页将与索引存储在同一文件组中

说明   在 ON {filegroup | DEFAULT} 和 TEXTIMAGE_ON {filegroup | DEFAULT} 的上下文中,DEFAULT 并不是关键字DEFAULT 是默认文件组的标识符并需对其进行定界,如 ON /”DEFAULT/”、ON [DEFAULT] 和 TEXTIMAGE_ON /”DEFAULT/” 或 TEXTIMAGE_ON [DEFAULT]

TEXTIMAGE_ON

是表示 text、ntext 和 image 列存储在指定文件组中的关键字如果表中没有 text、ntext 或 image 列,则不能使用 TEXTIMAGE ON如果没有指定 TEXTIMAGE_ON,则 text、ntext 和 image 列将与表存储在同一文件组中

data_type

指定列的数据类型可以是系统数据类型或用户定义数据类型用户定义数据类型必须先用 sp_addtype 创建,然后才能在表定义中使用

在 CREATE TABLE 语句中,用户定义数据类型的 NULL/NOT NULL 赋值可被替代但长度标准不能更改;不能在 CREATE TABLE 语句中指定用户定义数据类型的长度

DEFAULT

如果在插入过程中未显式提供值,则指定为列提供的值DEFAULT 定义可适用于除定义为 timestamp 或带 IDENTITY 属性的列以外的任何列除去表时,将删除 DEFAULT 定义只有常量值(如字符串)、系统函数(如 SYSTEM_USER())或 NULL 可用作默认值为保持与 SQL Server 早期版本的兼容,可以给 DEFAULT 指派约束名

constant_expression

是用作列的默认值的常量、NULL 或系统函数

IDENTITY

表示新列是标识列当向表中添加新行时,Microsoft? SQL Server? 将为该标识列提供一个唯一的、递增的值标识列通常与 PRIMARY KEY 约束一起用作表的唯一行标识符可以将 IDENTITY 属性指派给 tinyint、smallint、int、bigint、decimal(p,0) 或 numeric(p,0) 列对于每个表只能创建一个标识列不能对标识列使用绑定默认值和 DEFAULT 约束必须同时指定种子和增量,或者二者都不指定如果二者都未指定,则取默认值 (1,1)

seed

是装入表的第一行所使用的值

increment

是添加到前一行的标识值的增量值

NOT FOR REPLICATION

表示当复制登录(如 sqlrepl)向表中插入数据时,不强制 IDENTITY 属性复制的行必须保留发布数据库中所赋予的键值;NOT FOR REPLICATION 子句确保不向复制进程所插入的行赋予新的标识值其它登录所插入的行仍然具有以通常的方式创建的新标识值建议同时使用具有 NOT FOR REPLICATION 的 CHECK 约束,以确保赋予的标识值处于当前数据库所需的范围内

ROWGUIDCOL

表示新列是行的全局唯一标识符列对于每个表只能指派一个 uniqueidentifier 列作为 ROWGUIDCOL 列ROWGUIDCOL 属性只能指派给 uniqueidentifier 列如果数据库兼容级别小于或等于 65,则 ROWGUIDCOL 关键字无效有关更多信息,请参见 sp_dbcmptlevel

ROWGUIDCOL 属性并不强制列中所存储值的唯一性该属性也不会为插入到表中的新行自动生成值若要为每列生成唯一值,那么或者在 INSERT 语句中使用 NEWID 函数,或者将 NEWID 函数指定为该列的默认值

collation_name

指定列的排序规则排序规则名称既可以是 Windows 排序规则名称,也可以是 SQL 排序规则名称collation_name 仅适用于数据类型为 char、varchar、text、nchar、nvarchar 及 ntext 的列如果没有指定该参数,那么如果列的数据类型是用户定义的,则该列的排序规则就是用户定义数据类型的排序规则,否则就是数据库的默认排序规则

有关 Windows 和 SQL 排序规则名称的更多信息,请参见 COLLATE

CONSTRAINT

是可选关键字,表示 PRIMARY KEY、NOT NULL、UNIQUE、FOREIGN KEY 或 CHECK 约束定义的开始约束是特殊属性,用于强制数据完整性并可以为表及其列创建索引

constrain_name

是约束的名称约束名在数据库内必须是唯一的

NULL | NOT NULL

是确定列中是否允许空值的关键字从严格意义上讲,NULL 不是约束,但可以使用与指定 NOT NULL 同样的方法指定

PRIMARY KEY

是通过唯一索引对给定的一列或多列强制实体完整性的约束对于每个表只能创建一个 PRIMARY KEY 约束

UNIQUE

是通过唯一索引为给定的一列或多列提供实体完整性的约束一个表可以有多个 UNIQUE 约束

CLUSTERED | NONCLUSTERED

是表示为 PRIMARY KEY 或 UNIQUE 约束创建聚集或非聚集索引的关键字PRIMARY KEY 约束默认为 CLUSTERED,UNIQUE 约束默认为 NONCLUSTERED

在 CREATE TABLE 语句中只能为一个约束指定 CLUSTERED如果在为 UNIQUE 约束指定 CLUSTERED 的同时又指定了 PRIMARY KEY 约束,则 PRIMARY KEY 将默认为 NONCLUSTERED

[ WITH FILLFACTOR = fillfactor ]

指定 SQL Server 存储索引数据时每个索引页的充满程度用户指定的 fillfactor 取值范围从 1 到 100如果没有指定 fillfactor,则默认为 0创建索引时,fillfactor 的值越低,不必分配新空间即可由新索引项使用的空间就越多

FOREIGN KEY…REFERENCES

是为列中的数据提供引用完整性的约束FOREIGN KEY 约束要求列中的每个值在被引用表中对应的被引用列中都存在FOREIGN KEY 约束只能引用被引用表中为 PRIMARY KEY 或 UNIQUE 约束的列或被引用表中在 UNIQUE INDEX 内引用的列

ref_table

是 FOREIGN KEY 约束所引用的表名

(ref_column[,...n])

是 FOREIGN KEY 约束所引用的表中的一列或多列

ON DELETE {CASCADE | NO ACTION}

指定当要创建的表中的行具有引用关系,并且从父表中删除该行所引用的行时,要对该行采取的操作默认设置为 NO ACTION

如果指定 CASCADE,则从父表中删除被引用行时,也将从引用表中删除引用行如果指定 NO ACTION,SQL Server 将产生一个错误并回滚父表中的行删除操作

例如,在 Northwind 数据库中,Orders 表和 Customers 表之间有引用关系Orders.CustomerID 外键引用 Customers.CustomerID 主键

如果对 Customers 表的某行执行 DELETE 语句,并且为 Orders.CustomerID 指定 ON DELETE CASCADE 操作,则 SQL Server 将在 Orders 表中检查是否有与被删除的行相关的一行或多行如果存在相关行,则 Orders 表中的相关行将随 Customers 表中的被引用行一同删除

反之,如果指定 NO ACTION,若在 Orders 表中至少有一行引用 Customers 表中要删除的行,则 SQL Server 将产生一个错误并回滚 Customers 表中的删除操作

ON UPDATE {CASCADE | NO ACTION}

指定当要创建的表中的行具有引用关系,并且在父表中更新该行所引用的行时,要对该行采取的操作默认设置为 NO ACTION

如果指定 CASCADE,则在父表中更新被引用行时,也将在引用表中更新引用行如果指定 NO ACTION,SQL Server 将产生一个错误并回滚父表中的行更新操作

例如,在 Northwind 数据库中,Orders 表和 Customers 表之间有引用关系:Orders.CustomerID 外键引用 Customers.CustomerID 主键

如果对 Customers 表的某行执行 UPDATE 语句,并且为 Orders.CustomerID 指定 ON UPDATE CASCADE 操作,则 SQL Server 将在 Orders 表中检查是否有与被更新行相关的一行或多行如果存在相关行,则 Orders 表中的相关行将随 Customers 表中的被引用行一同更新

反之,如果指定 NO ACTION,若在 Orders 表中至少有一行引用 Customers 行,则 SQL Server 将产生一个错误并回滚对 Customers 行的更新操作

CHECK


是通过限制可输入到一列或多列中的可能值强制域完整性的约束

NOT FOR REPLICATION

是用于防止在复制所使用的分发过程中强制 CHECK 约束的关键字当表是复制发布的订户时,请不要直接更新订阅表,而要更新发布表,然后让复制进程将数据分发回订阅表可以在订阅表上定义 CHECK 约束,以防用户修改订阅表但是如果不使用 NOT FOR REPLICATION 子句,CHECK 约束同样会防止复制进程将修改从发布表分发给订阅表NOT FOR REPLICATION 子句表示对用户的修改(而不是对复制进程)强加约束

NOT FOR REPLICATION CHECK 约束适用于被更新记录的前像和后像,以防在复制范围中添加记录或从复制范围中删除记录将检查所有删除和插入操作;如果操作在复制范围内,则拒绝执行该操作

如果对标识符列使用此约束,则当复制用户更新标识列时,SQL Server 将允许不必重新计算表标识列的种子值

logical_expression

是返回 TRUE 或 FALSE 的逻辑表达式

column

是用括号括起来的一列或多列,在表约束中表示这些列用在约束定义中

[ASC | DESC]

指定加入到表约束中的一列或多列的排序次序默认设置为 ASC

n

是表示前面的项可重复 n 次的占位符

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270

推荐阅读更多精彩内容