此语句用于在数据库中创建新表,也可以在远程服务器中创建表。
CREATE [ GLOBAL TEMPORARY ] TABLE [ owner.]table-name
( { column-definition | table-constraint | pctfree }, ... )
[ { IN | ON } dbspace-name ]
[ ON COMMIT { DELETE | PRESERVE } ROWS
| NOT TRANSACTIONAL]
[ AT location-string ]
column-definition :
column-name data-type [ [ NOT ] NULL ]
[ DEFAULT default-value ] [ 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
| PRIMARY KEY [ CLUSTERED ]
| REFERENCES table-name
[ ( column-name ) ] [ actions ] [ CLUSTERED ]
}
| [ CONSTRAINT constraint-name ] CHECK ( condition )
| COMPUTE ( expression )
table-constraint :
[ CONSTRAINT constraint-name ] {
UNIQUE ( column-name, ... )
| PRIMARY KEY [ CLUSTERED ] ( column-name, ... )
| CHECK ( condition )
| foreign-key-constraint
}
foreign-key-constraint :
[ NOT NULL ] FOREIGN KEY [ role-name ] [ (column-name, ... ) ]
REFERENCES table-name [ (column-name, ... ) ] [ CLUSTERED ]
[ actions ] [ CHECK ON COMMIT ]
action :
ON { UPDATE | DELETE }
...{ 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 子句 IN 子句指定用来创建表的 dbspace。如果表是 GLOBAL TEMPORARY 表,则忽略 IN 子句。
有关 dbspace 的详细信息,请参见 CREATE DBSPACE 语句。
ON COMMIT 子句 ON COMMIT 子句只能用于临时表。缺省情况下,临时表的行将在 COMMIT(提交)时被删除。
NOT TRANSACTIONAL NOT TRANSACTIONAL 子句只能用于临时表。使用 NOT TRANSACTIONAL 创建的表不受 COMMIT 或 ROLLBACK 中的任何一个的影响。
在某些情况下,NOT TRANSACTIONAL 子句可以提高性能,因为对非事务性临时表执行的操作不会导致在回退日志中生成条目。例如,如果反复调用使用临时表的过程而不会干预 COMMIT 或 ROLLBACK,则可以使用 NOT TRANSACTIONAL。
AT 子句 在 location-string 指定的不同服务器中创建远程表,还在当前数据库中创建映射到此远程表的代理表。AT 子句支持分号 (;) 作为 location-string 中的字段分隔符。如果没有分号,则使用句号作为字段分隔符。这允许在数据库和所有者字段中使用文件名和扩展名。
例如,下面的语句将表 a1 映射到 MS Access 文件 mydbfile.mdb:
CREATE TABLE a1 AT 'access;d:\mydbfile.mdb;;a1'
有关远程服务器的信息,请参见 CREATE SERVER 语句。有关代理表的信息,请参见 CREATE EXISTING TABLE 语句和指定代理表位置。
忽略远程表的外键定义。引用远程表的本地表的外键定义也被忽略。如果远程服务器支持主键,则主键定义发送到此服务器。
忽略远程表的 COMPUTE 子句。
column-definition 定义表中的列。以下是部分列定义。
column-name 列名是标识符。同一表中的两列不能同名。有关详细信息,请参见标识符。
data-type 有关数据类型的信息,请参见 SQL 数据类型。
NOT NULL 如果指定 NOT NULL,或者列具有唯一约束或主键约束,则任何行中的此列都不能为 NULL。
DEFAULT 有关 special-value 的详细信息,请参见特殊值。
如果指定 DEFAULT,则它用作未指定列值的任何 INSERT 语句中的列值。如果不指定 DEFAULT,则等效于 DEFAULT NULL。
一些缺省值需要详细说明:
AUTOINCREMENT 使用 AUTOINCREMENT 时,列必须是整型数据类型之一或是精确的数值类型。
插入到表中时,如果没有指定 AUTOINCREMENT 列的值,则生成一个比列中的任何其它值都大的唯一值。如果 INSERT 指定了列值,则使用该值;如果指定的值大于当前列中的最大值,该值将用作后续插入的起始值。
删除行不会减少 AUTOINCREMENT 计数器的值。由于删除行而产生的间隙只能由使用插入时的显式赋值填充。显式插入小于该列最大值的行后,后面没有显式赋值的行仍自动增加比前一个最大值大 1 的值。
用于每列的下一个值以整型存储。使用大于 (231 – 1) 的值可能会导致绕回到不正确的值,这种情况下不要使用 AUTOINCREMENT。
通过检查 @@identity 全局变量,可以找到最近插入的列值。
标识列是使用 AUTOINCREMENT 缺省值的替代方法,与 Transact-SQL 兼容。在 Adaptive Server Anywhere 中,标识列作为 AUTOINCREMENT 缺省值实现。有关信息,请参见特殊 IDENTITY 列。
GLOBAL AUTOINCREMENT 当 SQL Remote 复制或 MobiLink 同步环境中将使用多个数据库时,使用该缺省值。
除了对域进行分区外,此缺省值类似于 AUTOINCREMENT。每个分区都包含相同数目的值。为每个数据库副本指定一个唯一全局数据库标识号。Adaptive Server Anywhere 只从使用数据库编号唯一标识的分区中提供数据库中的缺省值。
可以在紧跟在 AUTOINCREMENT 关键字后面的圆括号内指定分区大小。分区大小可以为任意正整数,但分区大小的选择一般需要保证任何一个分区内的编号资源不被用尽,或极少用尽。
对于类型为 BIGINT 或 UNSIGNED BIGINT 的列,缺省分区大小是 232 = 4294967296;对于其它类型的列,缺省分区大小是 216 = 65536。由于这些缺省值可能不合适(尤其当列不是 INT 或 BIGINT 类型时),因此最好显式地指定分区大小。
使用此缺省值时,每个数据库中的公共选项 Global_database_id 的值必须设置为唯一的非负整数。该值唯一标识数据库,并指示从哪个分区分配缺省值。允许的值的范围是 n p + 1 到 (n + 1) p,其中 n 是公共选项 Global_database_id 的值,p 是分区大小。例如,如果将分区大小定义为 1000,并将 Global_database_id 设置为 3,则范围将是 3001 到 4000。
如果前一个值小于 (n + 1) p,则下一个缺省值将比列中的前一个最大值大 1。如果列不包含任何值,则第一个缺省值为 n p + 1。不在当前分区内的列的值不影响缺省列值,即小于 pn + 1 或大于 p(n + 1) 的列值不影响缺省列值。如果通过 MobiLink 同步从另一个数据库复制了这些值,则这些值就可能存在。
由于不能将公共选项 Global_database_id 设置为负值,因此所选值总是正数。最大标识号只受列数据类型和分区大小的限制。
如果将公共选项 Global_database_id 设置为缺省值 2147483647,则在该列中插入一个空值。如果不允许空值,试图插入行时将出错。例如,如果列包含在表的主键中,便会发生这种情况。
当分区内的可用值用完时,也会生成空缺省值。在这种情况下,应为数据库指派一个新的 Global_database_id 值,以便从另一个分区中选择缺省值。如果该列不允许使用空值,则插入空值的尝试将导致错误。要检测提供的未使用值是否太小并处理该情况,请创建一个 GlobalAutoincrement 类型的事件。
在用版本 6 或更早版本的软件创建的数据库中,即使它们已升级,也不能使用 DEFAULT GLOBAL AUTOINCREMENT。
常量表达式 在 DEFAULT 子句中允许使用不参考数据库对象的常量表达式,因此可以使用 GETDATE 或 DATEADD 这类函数。如果表达式不是函数或简单值,必须用圆括号括起来。
TIMESTAMP 提供一种指示表中每行的上次修改时间的方法。当用 DEFAULT TIMESTAMP 声明列时,会提供一个缺省的插入值,每当更新行时,该值都用当前日期和时间更新。
要提供插入时的缺省值,而在每次更新时不改变,请使用 DEFAULT CURRENT TIMESTAMP 而不是 DEFAULT TIMESTAMP。
有关时间戳列的详细信息,请参见特殊的 Transact-SQL timestamp 列和数据类型。
用 DEFAULT TIMESTAMP 声明的列包含唯一值,以便应用程序能检测到同一行几乎同时发生的更新。如果当前时间戳的值与上一个值相同,它将增长 DEFAULT_TIMESTAMP_INCREMENT 选项的值。
有关详细信息,请参见 DEFAULT_TIMESTAMP_INCREMENT 选项 [database]。
在 Adaptive Server Anywhere 中,您可以根据 DEFAULT_TIMESTAMP_INCREMENT 选项自动截断时间戳的值。这对于同其它记录精度较低的时间戳值的数据库软件保持兼容很有用。
有关详细信息,请参见 TRUNCATE_TIMESTAMP_VALUES 选项 [database]。
全局变量 @@dbts 返回一个 TIMESTAMP 值,该值表示上次使用 DEFAULT TIMESTAMP 为列生成的值。有关详细信息,请参见全局变量。
string 有关详细信息,请参见字符串。
global-variable 有关详细信息,请参见全局变量。
column-constraint 列约束限制列能够保存的值。
table-constraint 表约束限制表的一列或多列能够保存的值。
约束 列约束和表约束有助于确保数据库的数据完整性。如果语句会导致违反约束,则该语句的执行不会完成。该语句在检测到错误前所做的任何更改都被撤消并报告错误。列约束是相应表约束的简化。
例如,下列语句是等效的:
CREATE TABLE Product ( product_num INTEGER UNIQUE ) CREATE TABLE Product ( product_num INTEGER, UNIQUE ( product_num ) )
正常情况下使用列约束,除非约束引用表中的多列。这些情况下,必须使用表约束。
约束包括以下这些:
CHECK 允许对任意条件进行校验。例如,检查约束可用于确保名为 Sex 的列只包含值 M 或 F。
表中的任何行都不能违反约束。如果 INSERT 或 UPDATE 语句会导致行违反约束,则不允许该操作并且撤消语句的执行结果。
仅当约束条件计算为 FALSE 时才拒绝更改,如果约束条件计算为 TRUE 或 UNKNOWN,则允许更改。
COMPUTE COMPUTE 约束只是列约束。使用 COMPUTE 约束创建列时,此列在任何行中的值均为提供的表达式的值。对于应用程序而言,使用此约束创建的列为只读列:计算完表达式后,数据库服务器将更改该值。
任何试图更改计算列的值的 UPDATE 语句都会触发与该列关联的所有触发器。
UNIQUE 标识唯一标识表中各行的一列或多列。表中任何两行的值在所有指定的列中不能相同。表可以有多个唯一约束。
唯一约束与唯一索引是有区别的。唯一索引的列可以为 NULL,而唯一约束的列不能为 NULL。外键可以引用主键或者具有唯一约束的列,但不能引用具有唯一索引的列,因为唯一索引可以包括多个 NULL 实例。
有关唯一索引的信息,请参见 CREATE INDEX 语句。
PRIMARY KEY 它与唯一约束相同,但表只能有一个主键约束。主键通常标识行的最佳标识符。例如,客户号可能是 customer 表的主键。
主键包括的列不能为 NULL。表的每一行均有一个唯一主键值。表只能有一个 PRIMARY KEY。
主键中的列顺序是在表中创建列时的顺序,而不是创建主键时列出它们的顺序。
有关 CLUSTERED 选项和聚簇索引的详细信息,请参见使用聚簇索引。
Foreign key 通过使用 REFERENCES 列约束(仅限于单列)或 FOREIGN KEY 表约束可以实现外键约束。它限制一组列的值与主键值匹配,或者在少数情况下,与另一个表(主表)的唯一约束值匹配。例如,外键约束可用于确保 invoice 表中的客户号与 customer 表中的客户号相对应。
如果在 REFERENCES 列约束中指定 column name,则列必须在主表中,必须受唯一约束或主键约束的制约,而且此约束必须仅包含那一列。如果不指定 column-name,则外键引用主表的主键。
有关 CLUSTERED 选项和聚簇索引的详细信息,请参见使用聚簇索引。
如果不显式定义外键列,则使用与主表中的相应列相同的数据类型创建外键列。这些自动创建的列不能属于外表的主键。因此,同时用于同一表的主键和外键的列必须显式创建。
如果指定外键列名,则还必须指定主键列名,列名按照列表中的位置成对出现。如果在 FOREIGN KEY 表约束中未指定主表列名,则使用主键列。如果未指定外键列名,则外键列的列名与主表的列名相同。
如果多列外键中至少有一个值为 NULL,则该键的其它列中可以保存的值没有限制。
临时表不能有引用基表的外键,而基表不能有引用临时表的外键。
NOT NULL 在外键列中禁止 NULL。外键中的 NULL 表示主表中没有与外表中的该行相对应的行。
role-name 角色名是外键的名称。角色名的主要作用是区分同一表的两个外键。如果不指定角色名,则按如下方式分配角色名:
如果没有与表名同名的角色名外键,则将表名指派为角色名。
如果表名已被使用,则角色名为表名加上表的唯一 3 位零填充数字。
action 参照完整性动作定义为维护数据库中的外键关系而采取的操作。每当更改主键值或从数据库表中删除主键值时,其它表中的相应外键值也应该以某种方式修改。可以指定 ON UPDATE 子句或 ON DELETE 子句或者两者,然后执行以下操作之一:
CASCADE 使用 ON UPDATE 时,更新相应的外键以匹配新主键值。使用 ON DELETE 时,从外键表中删除与已删除的主键匹配的行。
SET NULL 将所有与已更新或已删除的主键对应的外键值设置为 NULL。
SET DEFAULT 将与已更新或已删除的主键值匹配的外键值设置为每个外键列的 DEFAULT 子句中指定的值。
RESTRICT 如果在数据库的其它地方有相应的外键时试图更新或删除主键值,将发生错误。RESTRICT 是缺省操作。
CHECK ON COMMIT CHECK ON COMMIT 子句覆盖 WAIT_FOR_COMMIT 数据库选项,使数据库服务器在检查外键的 RESTRICT 操作前等待 COMMIT。CHECK ON COMMIT 子句不推迟 CASCADE、SET NULL 或 SET DEFAULT 操作。
如果使用 CHECK ON COMMIT 但不指定任何操作,则表示针对 UPDATE 和 DELETE 使用 RESTRICT 操作。
PCTFREE 指定希望为每个表页保留的可用空间的百分比。如果数据更新时行大小增加,将占用可用空间。如果表页中没有可用空间,则该页上的行大小每次增加时,行都需要在多个表页中拆分,从而导致行碎片并可能引起性能下降。
值 percent-free-space 是一个介于 0 和 100 之间的整数。前者指定每页上不保留剩余的可用空间:每页均完全填满。高值会将每行单独插入到页中。如果未设置 PCTFREE,则每页保留 200 字节。
PCTFREE 的值存储在 SYSATTRIBUTE 系统表中。
有关详细信息,请参见 SYSATTRIBUTE 系统表。
CREATE TABLE 语句创建新表。通过指定所有者名称,可为其他用户创建表。如果指定 GLOBAL TEMPORARY,则表为临时表。否则,表为基表。
与基表的定义一样,临时表的定义也存在于数据库中并一直保留在数据库中,直到被 DROP TABLE 语句显式删除。临时表中的行仅对插入行的连接是可见的。来自相同或不同应用程序的多个连接可同时使用同一临时表,而每个连接只能看到自己的行。连接结束时删除用于连接的临时表中的行。
必须有 RESOURCE 权限。
必须有 DBA 权限才能为其他用户创建表。
Windows CE 不支持用于创建代理表的 AT 子句。
自动提交。
SQL/92 初级特性。
SQL/99 核心特性。
以下为供应商扩展:
{ IN | ON } dbspace-name 子句。
ON COMMIT 子句
一些缺省值。
Sybase 受 Adaptive Server Enterprise 支持,有一些差异。
临时表 通过在 CREATE TABLE 语句中的表名前加上 # 符号,可以创建临时表。在 Adaptive Server Anywhere 中,这些是已声明的临时表,它们仅在当前连接中可用。有关信息,请参见 DECLARE LOCAL TEMPORARY TABLE 语句。
物理放置 在 Adaptive Server Anywhere 和 Adaptive Server Enterprise 中,表的物理放置方式不同。在 Adaptive Server Enterprise 中支持 ON segment-name 子句,在 Adaptive Server Anywhere 中也支持它,但 segment-name 引用 dbspace 名。
约束 Adaptive Server Anywhere 不支持命名约束或命名缺省值,但确实支持允许在数据类型定义中封装约束和缺省值定义的域。它还支持在 CREATE TABLE 语句中使用显式缺省值和 CHECK 条件。
NULL 缺省值 缺省情况下,Adaptive Server Enterprise 中的列缺省为 NOT NULL,而 Adaptive Server Anywhere 中的缺省设置为 NULL。使用 ALLOW_NULLS_BY_DEFAULT 数据库选项可控制此设置。应显式指定 NULL 或 NOT NULL,以便可在 Adaptive Server Anywhere 与 Adaptive Server Enterprise 之间传递数据定义语句。
有关详细信息,请参见 ALLOW_NULLS_BY_DEFAULT 选项 [compatibility]。
下面的示例为图书馆数据库创建用于保存图书信息的表。
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'
SQL Anywhere Studio 9.0.2
版权所有 © 1989–2005 Sybase, Inc. 部分版权所有 © 2001–2005 iAnywhere Solutions, Inc. 保留所有权利。