在数据库中创建新表,也可以在远程服务器中创建表。
CREATE [ GLOBAL TEMPORARY ] TABLE [ IF NOT EXISTS ] [ owner.]table-name ( { column-definition | table-constraint | pctfree }, ... ) [ { IN | ON } dbspace-name ] [ ENCRYPTED ] [ ON COMMIT { DELETE | PRESERVE } ROWS | NOT TRANSACTIONAL ] [ AT location-string ] [ SHARE BY ALL ]
column-definition : column-name data-type [ COMPRESSED ] [ INLINE { inline-length | USE DEFAULT } ] [ PREFIX { prefix-length | USE DEFAULT } ] [ [ NO ] INDEX ] [ [ NOT ] NULL ] [ DEFAULT default-value | IDENTITY ] [ column-constraint ... ]
default-value : special-value | string | global variable | [ - ] number | ( constant-expression ) | built-in-function( constant-expression ) | AUTOINCREMENT | CURRENT DATABASE | CURRENT REMOTE USER | CURRENT UTC TIMESTAMP | GLOBAL AUTOINCREMENT [ ( partition-size ) ] | NULL | TIMESTAMP | UTC TIMESTAMP | LAST USER
special-value: CURRENT { DATE | TIME | TIMESTAMP | USER | PUBLISHER | DATABASE | REMOTE USER | UTC TIMESTAMP } | USER
column-constraint : [ CONSTRAINT constraint-name ] { UNIQUE [ CLUSTERED ] | PRIMARY KEY [ CLUSTERED ] [ ASC | DESC ] | REFERENCES table-name [ ( column-name ) ] [ MATCH [ UNIQUE ] { SIMPLE | FULL } ] [ action-list ] [ CLUSTERED ] | CHECK ( condition ) } | COMPUTE ( expression )
table-constraint : [ CONSTRAINT constraint-name ] { UNIQUE [ CLUSTERED ] ( column-name [ ASC | DESC ], ... ) | PRIMARY KEY [ CLUSTERED ] ( column-name [ ASC | DESC ], ... ) | CHECK ( condition ) | foreign-key-constraint }
foreign-key-constraint : [ NOT NULL ] FOREIGN KEY [ role-name ] [ ( column-name [ ASC | DESC ], ... ) ] REFERENCES table-name [ ( column-name, ... ) ] [ MATCH [ UNIQUE] { SIMPLE | FULL } ] [ action-list ] [ CHECK ON COMMIT ] [ CLUSTERED ] [ FOR OLAP WORKLOAD ]
action-list : [ ON UPDATE action ] [ ON DELETE action ]
action : CASCADE | SET NULL | SET DEFAULT | RESTRICT
location-string : remote-server-name.[db-name].[owner].object-name | remote-server-name;[db-name];[owner];object-name
pctfree : PCTFREE percent-free-space
percent-free-space : integer
IN 子句 此子句用于指定基表所处的 dbspace。如果未指定此子句,则会在 default_dbspace 选项指定的 dbspace 中创建基表。
临时表只能在临时 dbspace 中创建。如果创建 GLOBAL TEMPORARY 表,并指定 IN,则会在临时 dbspace 中创建该表。如果指定用户定义的 dbspace,则会返回错误。
有关 dbspace 的详细信息,请参见:
ENCRYPTED 子句 ENCRYPTED 子句指定应对表加密。如果想要加密表,必须在创建数据库时启用表加密。将使用在数据库创建时间所指定的加密密钥和算法来加密表。请参见启用数据库中的表加密。
ON COMMIT 子句 ON COMMIT 子句仅适用于临时表。缺省情况下,临时表的行将在 COMMIT(提交)时被删除。如果指定了 SHARE BY ALL 子句,则必须指定 ON COMMIT PRESERVE ROWS 或 NOT TRANSACTIONAL。
NOT TRANSACTIONAL 子句 创建全局临时表时允许使用 NOT TRANSACTIONAL 子句。使用 NOT TRANSACTIONAL 创建的表不受 COMMIT 或 ROLLBACK 中的任何一个的影响。如果指定了 SHARE BY ALL 子句,则必须指定 ON COMMIT PRESERVE ROWS 或 NOT TRANSACTIONAL。有关 NOT TRANSACTIONAL 子句用处的信息,请参见使用临时表。
AT 子句 在 location-string 所指定的另一个服务器上创建一个远程表,同时在当前数据库中创建一个映射到该远程表的代理表。AT 子句支持分号 (;) 作为 location-string 中的字段分隔符。如果没有分号,则使用句号作为字段分隔符。利用此语法,便可在数据库和所有者字段中使用文件名和扩展名。
例如,下列语句将表 a1 映射到 Microsoft Access 文件 mydbfile.mdb:
CREATE TABLE a1 AT 'access;d:\mydbfile.mdb;;a1'; |
有关远程服务器的信息,请参见CREATE SERVER 语句。有关代理表的信息,请参见CREATE EXISTING TABLE 语句和指定代理表位置。
Windows Mobile 不支持 AT 子句。
在远程表上忽略外键定义。引用远程表的本地表的外键定义也被忽略。如果数据库服务器支持主键,则将主键定义发送到远程服务器。
SHARE BY ALL 子句 此子句仅在创建全局临时表时使用,以允许服务器的所有连接都共享相应表。如果指定了 SHARE BY ALL 子句,则必须指定 ON COMMIT PRESERVE ROWS 或 NOT TRANSACTIONAL。
有关临时表特性的信息,请参见使用临时表。
INLINE 和 PREFIX 子句 INLINE 子句用于指定要存储在行中的 BLOB 大小上限(以字节为单位)。小于等于 INLINE 子句所指定值的 BLOB 存储在行内部。超出 INLINE 子句所指定值的 BLOB 将存储在行外部的表扩展页中。另外,当 BLOB 大于 INLINE 值时,BLOB 开头部分某些字节的副本会保留在行中。PREFIX 子句用于指定要保留在行中的字节数。对于需要利用 BLOB 的前缀字节数来确定是接受还是拒绝某行的请求来说,PREFIX 子句可提高这些请求的性能。
压缩列的前缀数据未经压缩存储,因此如果满足请求所需的所有数据都存储在前缀中,则不必进行解压缩。
如果 INLINE 和 PREFIX 都未指定,或指定了 USE DEFAULT,则如下所述应用缺省值:
对于字符数据类型列(例如 CHAR、NCHAR 和 LONG VARCHAR),INLINE 的缺省值为 256,PREFIX 的缺省值为 8。
对于二进制数据类型列(例如 BINARY、LONG BINARY、VARBINARY、BIT、VARBIT、LONG VARBIT、BIT VARYING 和 UUID),INLINE 的缺省值为 256,PREFIX 的缺省值为 0。
强烈建议使用缺省值,除非出现需要另一种设置的特定情况。选择缺省值是为了在性能和磁盘空间要求间取得均衡。例如,如果将 INLINE 设置为较大值,并且所有 BLOB 都被内置存储,则行处理性能可能会下降。如果将 PREFIX 设置得过高,则要增加存储 BLOB 所需的磁盘空间量,因为前缀数据是由 BLOB 的一部分复制而来。
如果仅指定其中一个值,则另一个值会自动设置为不与指定值冲突的最大量。INLINE 和 PREFIX 值均不能超出数据库页面大小。此外,在表页中还要保留少量不可以用于存储行数据的开销。因此,如果指定的 INLINE 值近似于数据库页面大小,可导致要内置存储的字节数稍有减少。
INDEX 和 NO INDEX 子句 存储 BLOB(仅字符或二进制类型)时,指定 INDEX 可对超过内部 BLOB 大小阈值(约八个数据库页)的插入值创建 BLOB 索引。这是缺省行为。
当需要在 BLOB 内进行随机访问搜索时,BLOB 索引可提高性能。但对于某些类型的 BLOB 值(例如永远也不需要随机访问的映像和多媒体文件),关闭 BLOB 索引会提高性能。要关闭某列的 BLOB 索引,请指定 NO INDEX。
BLOB 索引与表索引不同。创建表索引是为了给一个或多个列中的值建立索引。
NULL 和 NOT NULL 子句 如果指定 NULL,则列中允许 NULL 值。这是缺省行为。
如果指定 NOT NULL,则不允许 NULL 值。
如果该列是 UNIQUE 或 PRIMARY KEY 约束的一部分,则即使指定 NULL,该列也不能包含 NULL。
DEFAULT 子句 有关 special-value 的详细信息,请参见特殊值。
如果指定了 DEFAULT 值,则它将用作未指定列值的任何 INSERT 语句中的列值。如果未指定任何 DEFAULT 值,则它相当于 DEFAULT NULL。
以下列出了 DEFAULT 的可能值:
序列表达式 可以将 DEFAULT 设为数据库序列中的当前值或下一个值。请参见使用序列来生成唯一值。
常量表达式 在 DEFAULT 子句中允许使用不引用数据库对象的常量表达式,因此可以使用 GETDATE 或 DATEADD 之类的函数。如果表达式不是函数或简单值,则必须用圆括号将其括起来。
CURRENT REMOTE USER 子句 CURRENT REMOTE USER 特殊值由 SQL Remote 的接收阶段在将消息应用于数据库时设置。CURRENT REMOTE USER 特殊值在触发器中最有用的作用是确定将要应用的操作是否由 SQL Remote 的接收阶段来应用,以及如果由接收阶段来应用,那么由哪个远程用户生成这些操作。请参见SQL Remote 消息代理实用程序 (dbremote)。
AUTOINCREMENT 子句 使用 AUTOINCREMENT 时,列必须是整型数据类型之一或是精确的数值类型。
插入到表中时,如果没有指定 AUTOINCREMENT 列的值,则生成一个比列中的任何其它值都大的唯一值。如果 INSERT 指定的列值大于列的当前最大值,则插入该值并将其用作后续插入的起点值。
删除行不会相应递减 AUTOINCREMENT 计数器的值。由于删除行而产生的间隙只能由使用插入时的显式赋值填充。显式插入小于该列最大值的列值后,后面没有显式赋值的行仍自动递增为比上一个最大值大 1 的值。
通过检查 @@identity 全局变量,可以找到最近一次插入的列值。请参见@@identity 全局变量。
AUTOINCREMENT 值会以有符号的 64 位整数形式保留,对应于 SYSTABCOL 系统视图中 max_identity 列的数据类型。当要生成的下一个值超过可以存储在指派了 AUTOINCREMENT 的列中的最大值时,将返回 NULL。如果此列已声明不允许 NULL(与主键列相同),将生成 SQL 错误。
可以使用 sa_reset_identity 过程重新设置用于列的下一个值。请参见sa_reset_identity 系统过程。
有关重建使用 AUTOINCREMENT 的数据库的信息,请参见重装带有自动增量列的表。
有关确定是序列值还是自动递增值更适合用作列中的值的信息,请参见在序列值和自动增量值之间进行选择。
IDENTITY 子句 IDENTITY 缺省值是使用 AUTOINCREMENT 缺省值的替代方法,该方法与 Transact-SQL 兼容。在 SQL Anywhere 中,定义为 IDENTITY 的列按 AUTOINCREMENT 执行。请参见特殊 IDENTITY 列。
GLOBAL AUTOINCREMENT 子句 此缺省值专用于在 MobiLink 同步环境或 SQL Remote 复制中使用多个数据库的情况。
此选项类似于 AUTOINCREMENT,只不过要对域进行分区。每个分区都包含相同数目的值。为每个数据库副本指定一个唯一全局数据库标识号。SQL Anywhere 只从用数据库编号唯一标识的分区中提供数据库中的缺省值。
可以在紧跟 AUTOINCREMENT 关键字之后的圆括号内指定分区大小。分区大小可以为任意正整数,但分区大小的选择通常要保证任何一个分区内的编号资源尽量不被用尽(如果曾有过这种情况)。
对于 BIGINT 或 UNSIGNED BIGINT 类型的列,缺省分区大小是 232 = 4294967296;对于所有其它类型的列,缺省分区大小是 216 = 65536。由于这些缺省值可能不合适(尤其当列不是 INT 或 BIGINT 类型时),因此最好显式指定分区大小。
使用此缺省值时,每个数据库中的公共选项 global_database_id 的值必须设置为唯一的非负整数。该值唯一标识数据库,并指示从哪个分区分配缺省值。允许的值范围是 np + 1 到 p(n + 1),其中 n 是公共选项 global_database_id 的值,p 是分区大小。例如,如果将分区大小定义为 1000 并将 global_database_id 设置为 3,则该范围将是 3001 到 4000。
如果上一个值小于 p(n + 1),则下一个缺省值比列中的上一个最大值大 1。如果列不包含任何值,则第一个缺省值为 np + 1。缺省列值不受当前分区之外的列值的影响,即不受小于 np + 1 或大于 p(n + 1) 的数的影响。如果通过 MobiLink 或 SQL Remote 从另一个数据库复制了这种值,就可能存在这种值。
通过检查 @@identity 全局变量,可以找到最近一次插入的列值。
GLOBAL AUTOINCREMENT 值会以有符号的 64 位整数形式保留,对应于 SYSTABCOL 系统视图中 max_identity 列的数据类型。当分区中可以提供的值用完时,将返回 NULL。如果此列已声明不允许 NULL(与主键列相同),将生成 SQL 错误。在这种情况下,应为数据库指派一个新的 global_database_id 值,以便可以从另一个分区中选择缺省值。若要检测提供的未用值是否过小并处理此情况,请创建一个 GlobalAutoincrement 类型的事件。请参见了解事件。
由于不能将公共选项 global_database_id 设置为负值,因此所选值始终是正数。最大标识号仅受列数据类型和分区大小的限制。
如果将公共选项 global_database_id 设置为缺省值 2147483647,则在列中插入 NULL 值。如果不允许使用 NULL 值,则尝试插入行时将出错。
可以使用 sa_reset_identity 过程重新设置用于列的下一个值。请参见sa_reset_identity 系统过程。
有关确定是序列值还是自动递增值更适合用作列中的值的信息,请参见在序列值和自动增量值之间进行选择。
TIMESTAMP 子句 用于指明表中每行的上次修改时间。当用 DEFAULT TIMESTAMP 声明列时,会提供一个缺省的插入值,每当更新行时,该值都用当前日期和时间更新。
要提供插入时的缺省值,而在每次更新时不改变,请使用 DEFAULT CURRENT TIMESTAMP 而不是 DEFAULT TIMESTAMP。
有关 TIMESTAMP 列的详细信息,请参见特殊的 Transact-SQL 时间戳列和数据类型。
以 DEFAULT TIMESTAMP 声明的列包含唯一值,以便应用程序能检测到同一行几乎同时发生的更新。如果当前 TIMESTAMP 的值与上一个值相同,它将按 default_timestamp_increment 选项的值相应递增。请参见truncate_timestamp_values 选项。
在 SQL Anywhere 中,您可以根据 default_timestamp_increment 选项自动截断时间戳的值。这对于同其它记录精度较低的时间戳值的数据库软件保持兼容很有用。请参见default_timestamp_increment 选项。
全局变量 @@dbts 返回一个 TIMESTAMP 值,该值表示上次使用 DEFAULT TIMESTAMP 为列生成的值。请参见全局变量。
UTC TIMESTAMP 子句 除了 UTC TIMESTAMP 值以协调通用时间 (UTC) 计算外,UTC TIMESTAMP 的行为与 TIMESTAMP 相同。
string 请参见字符串。
global-variable 请参见全局变量。
column-constraint 和 table-constraint 子句 列约束和表约束有助于确保数据库中数据的完整性。如果语句会导致违反约束,则该语句的执行不会完成。该语句在检测到错误前所做的任何更改都被撤消并报告错误。可以创建两类约束:检查约束和参照完整性(referential integrity,简称 RI)约束。检查约束用于指定要放入数据库中的列值所必须满足的条件。RI 约束将在不同表中的数据间建立一种关系,除了为数据指定唯一性要求之外,还必须维护这种关系。
有三种类型的 RI 约束:主键约束、外键约束和唯一约束。当创建 RI 约束(主键约束、外键约束或唯一约束)时,数据库服务器会通过在组成约束键的各列上隐式创建一个索引来强制实施该约束。该索引将按照指定方式在约束的键上创建。键由一组有序列以及每列的一序列值 (ASC/DESC) 组成。
可以在列或表上指定约束。一般来说,列约束是引用表中某一列的约束,而表约束可以引用表中一个或多个列。
PRIMARY KEY 约束子句 主键用于唯一定义表中的每个行。主键由一个列或多个列组成。一个表只能有一个主键。在 column-constraint 子句中,指定 PRIMARY KEY 则表示该列是表的主键。在 table-constraint 中,可使用 PRIMARY KEY 子句指定在以指定顺序合并时组成表的主键的一个或多个列。
主键中列的排序不必与各个列的相应序号匹配。也就是说,列在主键中的物理顺序不必与在行中的物理顺序相同。此外,不能指定重复的列名。
当创建主键时,会自动创建主键的索引。可通过为每个列指定 ASC(升序)或 DESC(降序)来指定索引中各值的排序方式。还可以使用 CLUSTERED 关键字指定是否聚簇索引。有关 CLUSTERED 选项和聚簇索引的详细信息,请参见使用聚簇索引。
主键包括的列不能为 NULL。表的每一行均有一个唯一主键值。
建议不要将近似数据类型(例如 FLOAT 和 DOUBLE)用于主键。近似数值数据类型在算术运算后容易产生舍入误差。
Foreign key 外键可将某组列的值限于与主键中的值匹配,或者与另一个表(主表)的唯一约束值匹配。例如,外键约束可用于确保 invoice 表中的客户号与 Customers 表中的客户号相对应。
有关数据库服务器如何自动为外键选择列的信息,请参见创建外键时忽略列名 (SQL)。
外键列顺序不必反映出表中的列顺序。
外键说明中不允许使用重复的列名。
如果没有为 UPDATE 或 DELETE 操作指定任何操作,缺省 action 为 RESTRICT。
当创建外键时,会自动创建外键的索引。可通过为每个列指定 ASC(升序)或 DESC(降序)来指定索引中各值的排序方式。还可以使用 CLUSTERED 关键字指定是否聚簇索引。有关 CLUSTERED 选项和聚簇索引的详细信息,请参见使用聚簇索引。
全局临时表不能有引用基表的外键,而基表不能有引用全局临时表的外键。
role-name 子句 角色名是外键的名称。角色名的主要作用是区分同一表的两个外键。如果不指定角色名,则按如下方式分配角色名:
如果没有与表名同名的角色名外键,则将表名指派为角色名。
如果表名已被使用,则角色名为表名加上表的唯一 3 位零填充数字。
REFERENCES 子句 外键约束可使用 REFERENCES 列约束(仅限单个列)或 FOREIGN KEY 表约束来实现,使用后者时,约束可指定一个或多个列。如果在 REFERENCES 列约束中指定 column-name,则此列必须在主表中,必须受唯一约束或主键约束的制约,而且该约束必须仅包含这一列。如果未指定 column-name,则外键列引用主表的单个主键列。
MATCH 子句 MATCH 子句可用于在使用多列外键时控制将何种情况视为匹配。它还允许您指定键的唯一性,从而免除了另外单独声明唯一性的必要。
以下列出了可指定的 MATCH 类型。有关 MATCH 类型如何影响匹配行为的描述,请参见本主题结尾的 "示例" 部分。
MATCH [ UNIQUE ] SIMPLE 如果键中至少有一列为 NULL,或者所有列值都与被引用表某行中的对应列值匹配,则引用表中发生行匹配。
MATCH SIMPLE 为缺省行为。
如果指定 UNIQUE 关键字,引用表对于非 NULL 键值只能有一项匹配。
至少有一个非 NULL 列值的键具有隐式唯一性。
MATCH [ UNIQUE ] FULL 如果键中所有列值都为 NULL,或者键中所有列值都不为 NULL 并与被引用表一行中的对应列值匹配,则引用表中发生行匹配。
如果指定 UNIQUE 关键字,引用表对于非 NULL 键值只能有一项匹配。
至少有一个非 NULL 列值的键具有隐式唯一性。
UNIQUE 子句 在 column-constraint 子句中,UNIQUE 约束指定列中的值必须唯一。在 table-constraint 子句中,UNIQUE 约束标识一个或多个唯一标识表中每行的列。表中任何两行的值在所有指定的列中不能相同。一个表可以有一个以上的 UNIQUE 约束。
UNIQUE 约束与唯一索引不同。唯一索引的列可以为 NULL,而 UNIQUE 约束中的列不能为 NULL。此外,外键可以引用主键或者 UNIQUE 约束,但不能引用唯一索引,因为唯一索引可以包含多个 NULL 实例。
可以按任意顺序指定 UNIQUE 约束中的列。此外,可以通过为每列指定 ASC(升序)或 DESC(降序)来指定自动创建的相应索引中各值的排序方式。但不能指定重复的列名。
建议不要将近似数据类型(例如 FLOAT 和 DOUBLE)用于具有唯一约束的列。近似数值数据类型在算术运算后容易产生舍入误差。
还可以使用 CLUSTERED 关键字指定是否聚簇约束。有关 CLUSTERED 选项的详细信息,请参见使用聚簇索引。
有关唯一索引的信息,请参见CREATE INDEX 语句。
CHECK 子句 此约束允许对任意条件进行校验。例如,CHECK 约束可用于确保名为 Sex 的列只包含值 M 或 F。
表中的任何行都不能违反 CHECK 约束。如果 INSERT 或 UPDATE 语句会导致行违反约束,则不允许执行相应操作并且撤消语句的作用。只有在 CHECK 约束条件求值结果为 FALSE 时才拒绝更改,如果 CHECK 约束条件求值结果为 TRUE 或 UNKNOWN,则允许更改。
COMPUTE 子句 COMPUTE 子句仅供在 column-constraint 子句中使用。在使用 COMPUTE 子句创建列时,该列在任何行中的值都是所提供表达式的值。使用此约束创建的列对于应用程序为只读列:只要对行进行了修改,数据库服务器就会更改该值。COMPUTE 表达式不应返回非确定性值。例如,它不应包含特殊值(如 CURRENT TIMESTAMP)或非确定性函数。如果 COMPUTE 表达式返回一个非确定性值,则不能使用它来匹配查询中的表达式。请参见使用计算列。
忽略远程表的 COMPUTE 子句。
任何尝试更改计算列的值的 UPDATE 语句都会触发与该列关联的所有触发器。
CHECK ON COMMIT 子句 CHECK ON COMMIT 选项将覆盖 wait_for_commit 数据库选项,使数据库服务器等到执行 COMMIT 之后再检查对外键的 RESTRICT 操作。CHECK ON COMMIT 选项延迟外键检查,但不延迟其它操作,如 CASCADE、SET NULL、SET DEFAULT 或检查约束。
FOR OLAP WORKLOAD 子句 当在外键定义的 REFERENCES 子句中指定 FOR OLAP WORKLOAD 时,数据库服务器会执行某些优化并收集有关键的统计信息以帮助提高 OLAP 负载的性能,特别是当 optimization_workload 选项设置为 OLAP 时。请参见optimization_workload 选项。
有关详细信息,请参见OLAP 支持。
PCTFREE 子句 指定要为每个表页保留的可用空间百分比。如果数据更新时行大小增加,将占用可用空间。如果表页中没有可用空间,则该页上的行大小每次增加时,行都需要在多个表页中拆分,从而导致行碎片并可能引起性能下降。
值 percent-free-space 是一个介于 0 和 100 之间的整数。0 表示每页上没有任何可用空间—每页均完全填满。如果值很高,会使每行单独插入到页中。如果未设置 PCTFREE,或稍后将其删除,则会根据数据库页大小应用缺省的 PCTFREE 值(4 KB(及以上)的页面大小应用 200 字节)。PCTFREE 的值存储在系统表 ISYSTAB 中。
CREATE TABLE 语句用于创建新表。通过指定所有者名称,可为其他用户创建表。如果指定 GLOBAL TEMPORARY,则表为临时表。否则,该表为基表。
通过在 CREATE TABLE 语句中的表名前加上井号 (#) 创建的表是已声明的临时表,这些表仅可用于当前连接。通过井号 (#) 创建的临时表与通过 ON COMMIT PRESERVE ROWS 子句创建的临时表相同。请参见DECLARE LOCAL TEMPORARY TABLE 语句。
同一范围内的两个局部临时表不得同名。如果使用与某个基表相同的名称创建临时表,该基表只能在局部临时表的范围结束时,才能在连接中变为可见。任何一个连接不能使用与现有临时表相同的名称创建基表。
缺省情况下,SQL Anywhere 中的列允许使用 NULL 值。可使用 allow_nulls_by_default 数据库选项控制此设置。请参见allow_nulls_by_default 选项。
DBA 或 RESOURCE 特权
自动提交。
SQL/2008 CREATE TABLE 是 SQL/2008 标准的核心功能,尽管 SQL Anywhere 中支持的某些它的组件是可选 SQL 语言功能。这些功能的子集包括:
临时表支持是 SQL 语言功能 F531。
对 IDENTITY 列的支持是 SQL 功能 T174,但 SQL Anywhere 使用的语法与标准中的语法稍有不同。
外键约束支持包括 SQL 语言功能 T191 "参照操作:RESTRICT"、F741 "参照 MATCH 类型"、F191 "参照删除操作" 和 F701 "参照更新操作"。请注意,SQL Anywhere 不支持 MATCH PARTIAL。
SQL Anywhere 不支持 SQL 语言功能 T591("可能空值列的 UNIQUE 约束")。在 SQL Anywhere 中,作为 PRIMARY KEY 或 UNIQUE 约束的组成部分的所有列必须声明为 NOT NULL。
CREATE TABLE 的以下组成部分是服务商扩充:
{ IN | ON } dbspace-name 子句。
ENCRYPTED、NOT TRANSACTIONAL 和 SHARE BY ALL 子句。
列定义的 COMPRESSED、INLINE、PREFIX 和 NO INDEX 子句。
由各种实现定义的 DEFAULT 值,包括 AUTOINCREMENT、GLOBAL AUTOINCREMENT、CURRENT DATABASE、CURRENT REMOTE USER、CURRENT UTC TIMESTAMP 和大多数特殊值。引用 SEQUENCE 生成器的 DEFAULT 子句也是服务商扩充。
MATCH UNIQUE 的指定。
PRIMARY KEY 或 FOREIGN KEY 子句上的排序顺序指定(ASC 或 DESC)。
按与在被引用表的 PRIMARY KEY 子句中指定的顺序不同的顺序指定 FOREIGN KEY 列的功能。
下面的示例为图书馆数据库创建用于保存图书信息的表。
CREATE TABLE library_books ( -- NOT NULL is assumed for primary key columns isbn CHAR(20) PRIMARY KEY, copyright_date DATE, title CHAR(100), author CHAR(50), -- column(s) corresponding to primary key of room -- are created automatically FOREIGN KEY location REFERENCES room ); |
以下示例为图书馆数据库创建用于保存借出图书信息的表。date_borrowed 的缺省值指示在创建条目的当天借出图书。date_returned 列在归还图书前一直为 NULL。
CREATE TABLE borrowed_book ( date_borrowed DATE NOT NULL DEFAULT CURRENT DATE, date_returned DATE, book CHAR(20) REFERENCES library_books (isbn), -- The check condition is UNKNOWN until -- the book is returned, which is allowed CHECK( date_returned >= date_borrowed ) ); |
以下示例将为某销售数据库创建保存订单和订单项信息的表。
CREATE TABLE Orders ( order_num INTEGER NOT NULL PRIMARY KEY, date_ordered DATE, name CHAR(80) ); CREATE TABLE Order_item ( order_num INTEGER NOT NULL, item_num SMALLINT NOT NULL, PRIMARY KEY ( order_num, item_num ), -- When an order is deleted, delete all of its -- items. FOREIGN KEY ( order_num ) REFERENCES Orders ( order_num ) ON DELETE CASCADE ); |
以下示例在虚拟的远程服务器 SERVER_A 上创建一个名为 t1 的表,并创建一个映射到该远程表的名为 t1 的代理表。
CREATE TABLE t1 ( a INT, b CHAR(10) ) AT 'SERVER_A.db1.joe.t1'; |
以下示例创建两个表,分别命名为 Table1 和 Table2,向 Table2 添加外键,向 Table1 插入值。最后的语句试图向 Table2 插入值。因为试图插入的值不是与 Table1 简单匹配,所以返回错误。
CREATE TABLE Table1 ( P1 INT, P2 INT, P3 INT, P4 INT, P5 INT, P6 INT, PRIMARY KEY ( P1, P2 ) ); CREATE TABLE Table2 ( F1 INT, F2 INT, F3 INT, PRIMARY KEY ( F1, F2 ) ); ALTER TABLE Table2 ADD FOREIGN KEY fk2( F1,F2 ) REFERENCES Table1( P1, P2 ) MATCH SIMPLE; INSERT INTO Table1 (P1, P2, P3, P4, P5, P6) VALUES ( 1,2,3,4,5,6 ); INSERT INTO Table2 (F1,F2) VALUES ( 3,4 ); |
以下语句显示当多列外键中的一些列(而不是所有列)为 NULL 时 MATCH SIMPLE 和 MATCH SIMPLE UNIQUE 对多列外键的不同处理方式:
CREATE TABLE pt( pk INT PRIMARY KEY, str VARCHAR(10)); INSERT INTO pt VALUES(1,'one'), (2,'two'); COMMIT;
CREATE TABLE ft1( fpk INT PRIMARY KEY, FOREIGN KEY (ref) REFERENCES pt MATCH SIMPLE); INSERT INTO ft1 VALUES(100,1), (200,1); //此语句将插入 2 行。
CREATE TABLE ft2( fpk INT PRIMARY KEY, FOREIGN KEY (ref) REFERENCES pt MATCH UNIQUE SIMPLE); INSERT INTO ft2 VALUES(100,1), (200,1); //此语句将失败,因为第二列的值不是唯一的。
|
以下语句显示 MATCH SIMPLE 和 MATCH UNIQUE SIMPLE 的不同之处:
CREATE TABLE pt2( pk1 INT NOT NULL, pk2 INT NOT NULL, str VARCHAR(10), PRIMARY KEY (pk1,pk2)); INSERT INTO pt2 VALUES(1,10,'one-ten'), (2,20,'two-twenty'); COMMIT; CREATE TABLE ft3( fpk INT PRIMARY KEY, ref1 INT, ref2 INT ); ALTER TABLE ft3 ADD FOREIGN KEY (ref1,ref2) REFERENCES pt2 (pk1,pk2) MATCH SIMPLE; CREATE TABLE ft4( fpk INT PRIMARY KEY, ref1 INT, ref2 INT ); ALTER TABLE ft4 add FOREIGN KEY (ref1,ref2) REFERENCES pt2 (pk1,pk2) MATCH FULL; INSERT INTO ft3 VALUES(100,1,10); // MATCH SIMPLE 测试成功;所有列值与 pt2 中的对应值匹配。 INSERT INTO ft3 VALUES(200,null,null); // MATCH SIMPLE 测试成功;键中至少一列为空值。 INSERT INTO ft3 VALUES(300,2,null); // MATCH SIMPLE 测试成功;键中至少一列为空值。 INSERT INTO ft4 VALUES(100,1,10); // MATCH FULL 测试成功;所有列值与 pt2 中的对应值匹配。 INSERT INTO ft4 VALUES(200,null,null); // MATCH FULL 测试成功;键中所有列值为空值。 INSERT INTO ft4 VALUES(300,2,null); // MATCH FULL 测试失败;键中两列必须都为空值或都与 pt2 中的对应值匹配。 |
![]() |
使用DocCommentXchange 讨论此页。
|
版权 © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |