CREATE 是负责数据库对象的创建,数据库、数据表、数据库索引、存储程序、用户函数、触发程序或是用户自定类型等对象,都可以使用 CREATE 指令来创建,而为了各式数据库对象的不同,CREATE 也有很多的参数,包含众多关键字(AGGREGATE聚合函数,APPLICATION ROLE应用程序角色,ASSEMBLY托管的应用程序块,ASYMMETRIC KEY非对称密钥等等详细见官档)
1:CREATE DATABASE
----------SYNTAX-----------
CREATE DATABASE database_name
[ CONTAINMENT = { NONE | PARTIAL } ]
[ ON
[ PRIMARY ] <filespec> [ ,...n ]
[ , <filegroup> [ ,...n ] ]
[ LOG ON <filespec> [ ,...n ] ]
]
[ COLLATE collation_name ]
[ WITH <option> [,...n ] ]
[;]
<filespec> ::=
{
(
NAME = logical_file_name ,
FILENAME = { 'os_file_name' | 'filestream_path' }
[ , SIZE = size [ KB | MB | GB | TB ] ]
[ , MAXSIZE = { max_size [ KB | MB | GB | TB ] | UNLIMITED } ]
[ , FILEGROWTH = growth_increment [ KB | MB | GB | TB | % ] ]
)
}
<filegroup> ::=
{
FILEGROUP filegroup_name [ [ CONTAINS FILESTREAM ] [ DEFAULT ] | CONTAINS MEMORY_OPTIMIZED_DATA ]
<filespec> [ ,...n ]
}
<option> ::=
{
FILESTREAM ( <filestream_option> [,...n ] )
| DEFAULT_FULLTEXT_LANGUAGE = { lcid | language_name | language_alias }
| DEFAULT_LANGUAGE = { lcid | language_name | language_alias }
| NESTED_TRIGGERS = { OFF | ON }
| TRANSFORM_NOISE_WORDS = { OFF | ON}
| TWO_DIGIT_YEAR_CUTOFF = <two_digit_year_cutoff>
| DB_CHAINING { OFF | ON }
| TRUSTWORTHY { OFF | ON }
| PERSISTENT_LOG_BUFFER=ON ( DIRECTORY_NAME='<Filepath to folder on DAX formatted volume>' )
}
<filestream_option> ::=
{
NON_TRANSACTED_ACCESS = { OFF | READ_ONLY | FULL }
| DIRECTORY_NAME = 'directory_name'
}
<service_broker_option> ::=
{
ENABLE_BROKER
| NEW_BROKER
| ERROR_BROKER_CONVERSATIONS
}
---------注释---------
1: CONTAINMENT = { NONE | PARTIAL }
适用于:SQL Server 2012 (11.x) 及更高版本,指定数据库的包含状态。 NONE = 非包含数据库。 PARTIAL = 部分包含的数据库
2:ON
指定显式定义用来存储数据库数据部分的磁盘文件(数据文件)。 当后面是以逗号分隔的、用以定义主文件组的数据文件的 <filespec> 项列表时,需要使用 ON。 主文件组的文件列表可后跟以逗号分 隔的、用以定义用户文件组及其文件的 <filegroup> 项列表(可选)。
3:PRIMARY
指定关联的 <filespec> 列表定义主文件。如果没有指定 PRIMARY,那么 CREATE DATABASE 语句中列出的第一个文件将成为主文件。
4:LOG ON
指定显式定义用来存储数据库日志的磁盘文件(日志文件)。如果没有指定 LOG ON,将自动创建一个日志文件,其大小为该数据库的所有数据文件大小总和的 25% 或 512 KB,取两者之中的较大者。 此文件放置于默认的日志文件位置。 (对于自动生成的日志文件\数据文件,SQL Server 会通过向 database_name 追加后缀来为日志生成 logical_file_name 和 os_file_name 。 这会将 database_name 限制为 123 个字符,从而使生成的文件名称不超过 128 个字符。)不能对数据库快照(CREATE DATABASE Snapshot)指定 LOG ON。
5:COLLATE collation_name
指定数据库的默认排序规则。 排序规则名称既可以是 Windows 排序规则名称,也可以是 SQL 排序规则名称。 如果没有指定排序规则,则将 SQL Server 实例的默认排序规则分配为数据库的排序规 则.不能对数据库快照指定排序规则.
6:<filestream_options>(文件流可选项标签)
NON_TRANSACTED_ACCESS = { OFF | READ_ONLY | FULL } 禁止非事务访问/可以通过非事务进程读取数据库中的FILESTREAM/启用完全非事务访问:指定对数据库的非事务性 FILESTREAM 访问的级别。适用于:SQL Server 2012 (11.x) 及更高版本 。
DIRECTORY_NAME = <directory_name>:与 Windows 兼容的目录名称。 此名称应在 SQL Server 实例的所有 Database_Directory 名称中唯一。 无论 SQL Server 排序规则设置如何,唯一性比较都不区分大小写。在此数据库中创建 FileTable 之前,应设置此选项。仅在将 CONTAINMENT 设置为 PARTIAL 之后,才允许使用以下选项。 如果将 CONTAINMENT 设置为 NONE,将发生错误。
----------Demo-------------
USE master;
GO
CREATE DATABASE Sale
ON PRIMARY
(NAME=Sale_1,FILENAME='/home/bohemian/SqlData/Sale_1.mdf',SIZE=1,MAXSIZE=50,FILEGROWTH=10%),
FILEGROUP Sale_Group_1
(NAME=Sale_2,FILENAME='/home/bohemian/SqlData/Sale_2.ndf',SIZE=10,MAXSIZE=50,FILEGROWTH=1MB)
LOG ON
(NAME=Sale_log,FILENAME='/home/bohemian/SqlLog/Sale_log.ldf',SIZE=1,MAXSIZE=10,FILEGROWTH=1MB);
GO
[注1]:FILEGROUP约束或者说起作用的范围仅限于下一个','之前的内容.
[注2]:文件的物理地址需要确认在数据库默认的数据和日志文件目录之下或者通过下面的命令改为自己设定的文件夹,否则可能出现Invalid filename的报错
sudo chown mssql /home/bohemian/SqlData
sudo chgrp mssql /home/bohemian/SqlData
sudo chown mssql /home/bohemian/SqlLog
sudo chgrp mssql /home/bohemian/SqlLog
sudo /opt/mssql/bin/mssql-conf set filelocation.masterdatafile /tmp/masterdatabasedir/master.mdf
sudo /opt/mssql/bin/mssql-conf set filelocation.masterlogfile /tmp/masterdatabasedir/mastlog.ldf
2:CREATE TABLE
-- Memory optimized CREATE TABLE Syntax
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ GENERATED ALWAYS AS ROW { START | END } [ HIDDEN ] ]
[ NULL | NOT NULL ]
[
[ CONSTRAINT constraint_name ] DEFAULT memory_optimized_constant_expression ]
| [ IDENTITY [ ( 1, 1 ) ]
]
[ <column_constraint> ]
[ <column_index> ]
/*COLLATE collation_name 指定列的排序规则.排序规则名称既可以是 Windows 排序规则名称,也可以是 SQL 排序规则名称。 collation_name 仅适用于 char、varchar、text、nchar、nvarchar 和 ntext 数据类型列 。
CONSTRAINT 可选关键字,表示 PRIMARY KEY、NOT NULL、UNIQUE、FOREIGN KEY 或 CHECK 约束定义的开始。
constraint_name 是约束的名称。 约束名称必须在表所属的架构中唯一。
<data_type> ::=
[type_schema_name . ] type_name [ (precision [ , scale ]) ]
/* type_schema_name . ] type_name 指定列的数据类型以及该列所属的架构。 对于基于磁盘的表,可以为以下数据类型之一:
系统数据类型;基于SQL SERVER系统数据类型的别名类型;用户定义类型
precision指定的数据类型的精度;scale指定的数据类型的小数位数
<column_constraint> ::=
[ CONSTRAINT constraint_name ]
{
{ PRIMARY KEY | UNIQUE }
{ NONCLUSTERED
| NONCLUSTERED HASH WITH (BUCKET_COUNT = bucket_count)
}
| [ FOREIGN KEY ]
REFERENCES [ schema_name . ] referenced_table_name [ ( ref_column ) ]
| CHECK ( logical_expression )
}
< table_constraint > ::=
[ CONSTRAINT constraint_name ]
{
{ PRIMARY KEY | UNIQUE }
{
NONCLUSTERED (column [ ASC | DESC ] [ ,... n ])
| NONCLUSTERED HASH (column [ ,... n ] ) WITH ( BUCKET_COUNT = bucket_count )
}
| FOREIGN KEY
( column [ ,...n ] )
REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]
| CHECK ( logical_expression )
}
<column_index> ::=
INDEX index_name
{ [ NONCLUSTERED ] | [ NONCLUSTERED ] HASH WITH (BUCKET_COUNT = bucket_count)}
<table_index> ::=
INDEX index_name
{ [ NONCLUSTERED ] HASH (column [ ,... n ] ) WITH (BUCKET_COUNT = bucket_count)
| [ NONCLUSTERED ] (column [ ASC | DESC ] [ ,... n ] )
[ ON filegroup_name | default ]
| CLUSTERED COLUMNSTORE [WITH ( COMPRESSION_DELAY = {0 | delay [Minutes]})]
[ ON filegroup_name | default ]
}
<table_option> ::=
{
MEMORY_OPTIMIZED = ON
| DURABILITY = {SCHEMA_ONLY | SCHEMA_AND_DATA}
| SYSTEM_VERSIONING = ON [ ( HISTORY_TABLE = schema_name . history_table_name
[, DATA_CONSISTENCY_CHECK = { ON | OFF } ] ) ]
}
CREATE TABLE
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
( { <column_definition>
| [ <table_constraint> ] [ ,... n ]
| [ <table_index> ]
[ ,... n ] }
[ PERIOD FOR SYSTEM_TIME ( system_start_time_column_name
, system_end_time_column_name ) ]
)
[ WITH ( <table_option> [ ,... n ] ) ]
[ ; ]
-----------Demo-----------
[注1]:计算列的问题
[注2]:Disk-base table和内存优化表的区别内存优化表驻留在内存中,使用 Hekaton 内存数据库引擎实现。在查询时,从内存中读取数据行;在更新时,将数据的更新直接写入到内存中。内存优化表能够在disk上维护一个副本,用于持久化数据集。http://www.111com.net/database/mssqlserver/117103.htm
[注3]:列约束和表约束问题,列约束包含在列定义之中在标签<column_definition>之中可以看到包含了<column_constraint>标签,表约束和列约束相互独立
并且使用','分隔,可选类别只有PRIMARY/UNIQUE/FOREIGN/CHECK,比列约束少一个Default约束
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> ] }
[ ,...n ]
)
[注4]:UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。PRIMARY KEY 拥有自动定义的 UNIQUE 约束。{ PRIMARY KEY | UNIQUE }