Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 使用 SQL » SQL 语句 » SQL 语句 (A-D)

 

CREATE TABLE 语句

此语句用于在数据库中创建新表,也可以在远程服务器中创建表。

语法
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
   | UTC TIMESTAMP 
   | USER 
   | PUBLISHER 
}
| 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 ] 
   }
| [ CONSTRAINT constraint-name ] 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。

    有关临时表特性的信息,请参见使用临时表

  • IF NOT EXISTS 子句   此子句用于创建永久表、全局临时表和局部临时表。如果指定的表已存在,则不会进行任何更改,也不会返回错误。

    有关临时表特性的信息,请参见使用临时表

  • column-definition   定义表中的列。以下是部分列定义。

    • column-name   列名是一个标识符。同一表中的两列不能同名。请参见标识符

    • data-type   存储在列中的数据类型。请参见SQL 数据类型

    • COMPRESSED   压缩列。例如,下面的语句将创建表 t,其中含有两个列:filename 和 contents。contents 列为 LONG BINARY 且已压缩:
      CREATE TABLE t ( 
        filename VARCHAR(255), 
        contents LONG BINARY COMPRESSED 
      );

  • 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 子句中允许使用不引用数据库对象的常量表达式,因此可以使用 GETDATE 或 DATEADD 之类的函数。如果表达式不是函数或简单值,则必须用圆括号将其括起来。

    • CURRENT REMOTE USER    当 CURRENT REMOTE USER 执行未提供文档的 REMOTE USER 语句时,由 SQL Remote 消息代理 (dbremote) 来设置其缺省值。除非从 DBREMOTE 进行连接,否则该值将为 NULL。请参见消息代理 (dbremote)

    • AUTOINCREMENT   使用 AUTOINCREMENT 时,列必须是整型数据类型之一或是精确的数值类型。

      插入到表中时,如果没有指定 AUTOINCREMENT 列的值,则生成一个比列中的任何其它值都大的唯一值。如果 INSERT 指定的列值大于列的当前最大值,则插入该值并将其用作后续插入的起点值。

      删除行不会相应递减 AUTOINCREMENT 计数器的值。由于删除行而产生的间隙只能由使用插入时的显式赋值填充。显式插入小于该列最大值的列值后,后面没有显式赋值的行仍自动递增为比上一个最大值大 1 的值。

      通过检查 @@identity 全局变量,可以找到最近一次插入的列值。请参见@@identity 全局变量

      AUTOINCREMENT 值会以有符号的 64 位整数形式保留,对应于 SYSTABCOL 系统视图中 max_identity 列的数据类型。当要生成的下一个值超过可以存储在指派了 AUTOINCREMENT 的列中的最大值时,将返回 NULL。如果此列已声明不允许 NULL(与主键列相同),将生成 SQL 错误。

      有关重建使用 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 值,则尝试插入行时将出错。

  • TIMESTAMP 子句   用于指明表中每行的上次修改时间。当用 DEFAULT TIMESTAMP 声明列时,会提供一个缺省的插入值,每当更新行时,该值都用当前日期和时间更新。

    要提供插入时的缺省值,而在每次更新时不改变,请使用 DEFAULT CURRENT TIMESTAMP 而不是 DEFAULT TIMESTAMP。

    有关 timestamp 列的详细信息,请参见特殊的 Transact-SQL 时间戳列和数据类型

    以 DEFAULT TIMESTAMP 声明的列包含唯一值,以便应用程序能检测到同一行几乎同时发生的更新。如果当前时间戳的值与上一个值相同,它将按 default_timestamp_increment 选项的值相应递增。请参见default_timestamp_increment 选项 [数据库] [MobiLink 客户端]

    在 SQL Anywhere 中,您可以根据 default_timestamp_increment 选项自动截断时间戳的值。这对于同其它记录精度较低的时间戳值的数据库软件保持兼容很有用。请参见default_timestamp_increment 选项 [数据库] [MobiLink 客户端]

    全局变量 @@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 选项和聚簇索引的详细信息,请参见使用聚簇索引

      临时表不能有引用基表的外键,而基表不能有引用临时表的外键。

      • NOT NULL 选项   外键列中不允许使用 NULL。外键中的 NULL 表示主表中没有任何行与外表中的此行相对应。

      • role-name 子句   角色名是外键的名称。角色名的主要作用是区分同一表的两个外键。如果不指定角色名,则按如下方式分配角色名:

        1. 如果没有与表名同名的角色名外键,则将表名指派为角色名。

        2. 如果表名已被使用,则角色名为表名加上表的唯一 3 位零填充数字。

      • REFERENCES 子句   外键约束可使用 REFERENCES 列约束(仅限单个列)或 FOREIGN KEY 表约束来实现,使用后者时,约束可指定一个或多个列。如果在 REFERENCES 列约束中指定 column-name,则此列必须在主表中,必须受唯一约束或主键约束的制约,而且该约束必须仅包含这一列。如果未指定 column-name,则外键列引用主表的单个主键列。

      • MATCH 子句   MATCH 子句可用于在使用多列外键时控制将何种情况视为匹配。它还允许您指定键的唯一性,从而免除了另外单独声明唯一性的必要。以下列出了可指定的匹配类型:

        • UNIQUE 选项   引用表对于非 NULL 键值只能有一项匹配(至少有一个非 NULL 列值的键具有隐式唯一性)。

        • SIMPLE 选项   如果键中至少有一列为 NULL,或者所有列值都与被引用表某行中的对应列值匹配,则引用表中发生行匹配。

        • FULL 选项   如果键中所有列值都为 NULL,或者所有列值都与被引用表某行中的值相匹配,则引用表中发生行匹配。

        • SIMPLE UNIQUE 选项   如果同时满足 SIMPLE 和 UNIQUE 的条件,则发生匹配。

        • FULL UNIQUE 选项   如果同时满足 FULL 和 UNIQUE 的条件,则发生匹配。

    • 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,则允许更改。

      有关 TRUE、FALSE 和 UNKNOWN 条件的详细信息,请参见NULL 值搜索条件

    • 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 操作。

    如果使用 CHECK ON COMMIT 但未指定任何操作,则将 RESTRICT 暗指为 UPDATE 和 DELETE 的操作。

  • 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 选项 [兼容性]

权限

必须具有 RESOURCE 权限。

必须有 DBA 权限才能为其他用户创建表。

副作用

自动提交。

另请参见
标准和兼容性
  • SQL/2003   核心特性。

    以下为服务商扩充:

    • { IN | ON } dbspace-name 子句。

    • ON COMMIT 子句。

    • 一些缺省值。

示例

下面的示例为图书馆数据库创建用于保存图书信息的表。

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';