此语句用于创建表。
CREATE TABLE [ IF NOT EXISTS ] table-name ( { column-definition | table-constraint| sync-constraint }, ... )
column-definition : column-name data-type [ [ NOT ] NULL ] [ DEFAULT column-default] [STORE AS FILE (file-name) [CASCADE DELETE ] [ column-constraint ]
column-default : AUTOFILENAME(prefix,extension) | GLOBAL AUTOINCREMENT [ ( number ) ] | AUTOINCREMENT | CURRENT DATE | CURRENT TIME | CURRENT TIMESTAMP | NULL | NEWID( ) | constant-value
file-name "filename"
column-constraint : PRIMARY KEY | UNIQUE
table-constraint : { [ CONSTRAINT constraint-name ] pkey-constraint | fkey-constraint | unique-key-constraint } [ WITH MAX HASH SIZE integer ]
pkey-constraint :
PRIMARY KEY [ ordered-column-list ]
fkey-constraint : [ NOT NULL ] FOREIGN KEY [ role-name ] ( ordered-column-list ) REFERENCES table-name ( column-name, ... ) [ CHECK ON COMMIT ]
unique-key-constraint : UNIQUE ( ordered-column-list )
ordered-column-list : ( column-name [ ASC | DESC ], ... )
sync-constraint :SYNCHRONIZE ON|OFF|ALL
IF NOT EXISTS 子句 此子句用于创建表。如果指定的表已存在,则不会进行任何更改,也不会返回错误。
column-definition 定义表中的列。此子句的可用参数包括:
column-name 列名是一个标识符。同一表中的两列不能同名。请参见UltraLite 中的标识符。
使用 BlackBerry OS 4.2 或 J2SE 的 UltraLiteJ 支持数据库文件的分区,以便外部文件现在可以用于存储大的 BLOB 值,并使用 file_name 和 file_contents 列引用这些文件。file_name 列存储 CHAR(size) 数据类型,file_contents 列存储 LONG BINARY 数据类型。此列为只读列。
请参见UltraLite 中的数据类型。
data-type 列的数据类型。请参见UltraLite 中的数据类型。
[ NOT ] NULL 如果指定 NOT NULL,或者列具有 PRIMARY KEY 或 UNIQUE 约束,则该列在任何行中都不能含有 NULL。否则,允许包含 NULL。
column-default 设置列的缺省值。如果指定了 DEFAULT 值,则它将用作未指定列值的任何 INSERT 语句中的列值。如果未指定任何 DEFAULT 值,则它等效于 DEFAULT NULL。缺省值选项包括:
AUTOFILENAME 此子句支持在经过分区的 UltraLiteJ 数据库中存储外部 BLOB 文件。
file_name 列需要 AUTOFILENAME(prefix,extension) 子句。此子句用于指定将如何为下载的 BLOB 值生成新的文件名。prefix 值和 extension 值是字符串文字常量。文件名必须有效。对于 BlackBerry,根据数据库选项 OPTION_BLOB_FILE_BASE_DIR 解析相对文件名。如果 UltraLite 确定文件名没有以前缀 "file://" 开头,则会在尝试打开此文件之前将 OPTION_BLOB_FILE_BASE_DIR 选项的值添加到文件名的前面。请参见OPTION_BLOB_FILE_BASE_DIR 变量。
AUTOINCREMENT 仅适用于 UltraLiteJ。
使用 AUTOINCREMENT 时,列必须是整型数据类型之一或是精确的数字类型。插入到表中时,如果没有指定 AUTOINCREMENT 列的值,则生成一个比列中的任何其它值都大的唯一值。如果 INSERT 指定的列值大于列的当前最大值,则该值将用作后续插入的起点值。
在 UltraLite 中,创建表时自动增量值不能设置为 0。如果该列使用有符号数据类型,AUTOINCREMENT 将生成负值。因此,应将 AUTOINCREMENT 列声明为无符号整数,以防止使用负值。
GLOBAL AUTOINCREMENT 与 AUTOINCREMENT 类似,只不过要对域进行分区。每个分区都包含相同数目的值。为每个数据库副本指定一个唯一全局数据库标识号。UltraLite 只从用数据库编号唯一标识的分区中提供数据库中的缺省值。
对于 BIGINT 或 UNSIGNED BIGINT 类型的列,缺省分区大小是 2^32 = 4294967296;对于所有其它类型的列,缺省分区大小是 2^16 = 65536。由于这些缺省值可能不合适(尤其当列不是 INT 或 BIGINT 类型时),因此最好显式指定分区大小。
请参见在 UltraLite 中使用 GLOBAL AUTOINCREMENT和UltraLite global_database_id 选项。
[ NOT ] NULL 控制列是否可以包含 NULL。
NEWID( ) 生成一个唯一标识符值的函数。请参见NEWID 函数 [Miscellaneous]。
CURRENT TIMESTAMP 组合 CURRENT DATE 和 CURRENT TIME,以构成包含年、月、日、小时、分钟、秒和秒的小数部分的 TIMESTAMP 值。秒的小数值存储到 3 个小数位。其准确性受系统时钟准确性的限制。请参见CURRENT TIMESTAMP 特殊值。
CURRENT DATE 存储当前年月日。请参见CURRENT DATE 特殊值。
CURRENT TIME 存储当前小时、分钟、秒和秒的小数值。请参见CURRENT TIME 特殊值。
constant-value 列的数据类型的常量。该常量通常是一个数字或一个字符串。
STORE AS FILE (file-name) [CASCADE DELETE] 仅适用于 UltraLiteJ。
file_contents 列必须指定一个现有的 CHAR 列作为 STORE AS FILE 参数。file_contents 列的行为与只读列相同。
删除包含某个 BLOB 文件的行时,如果指定 CASCADE DELETE,则会删除该文件。否则该文件将保留在文件系统中,并且不会再成为数据库的属性。指定 CASCADE DELETE 子句可确保不会将同一个文件两次插入到数据库。回退某次插入操作时,即使指定 CASCADE DELETE,也不会删除该文件。
更改文件名列的内容的更新操作与 INSERT 之前的 DELETE 操作完全相同。如果指定了 CASCADE DELETE,旧文件名所指向的文件将被删除。如果更新包含某个 BLOB 文件的行而未更改文件名列,或者将文件名列更新为完全相同的值,则系统会阻止他人删除该 BLOB 文件。可能不会在 UPDATE 语句中更改 BLOB 文件列。
column-constraint 子句 指定列约束以限制可出现在列中的值。列约束可以为下列项之一:
PRIMARY KEY 设置为 column-constraint 的一部分时,PRIMARY KEY 子句将此列设置为表的主键。主键用于唯一标识表中的每一行。缺省情况下,主键包括的列不能为 NULL。
UNIQUE 标识唯一标识表中各行的一列或多列。表中任何两行的值在所有指定的列中不能相同。表可以有多个唯一约束。不允许使用 NULL 值。
table-constraint 子句 指定表约束以限制此表中一个或多个列可包含的值。CONSTRAINT 子句用于为表约束指定标识符。表约束可以为主键约束、外键约束或唯一约束的形式,如以下定义:
pkey-constraint 子句 将指定列设置为表的主键。主键用于唯一标识表中的每一行。主键包括的列不能为 NULL。
fkey-constraint 子句 指定外键约束以限制一个或多个列的值必须与另一个表的主键(或唯一约束)中的值匹配。
NOT NULL 子句 指定 NOT NULL 以在外键列中不允许使用 NULL。外键中的 NULL 表示主表中没有任何行与外表中的此行相对应。如果多列外键中至少有一个值为 NULL,则该键的其它列中可以保存的值没有限制。
role-name 子句 指定 role-name 命名外键。role-name 用于区分相同表中的外键。或者,可使用 CONSTRAINT constraint-name 命名外键。但是,请勿同时使用两种方法来命名外键。
REFERENCES 子句 指定 REFERENCES 子句以将主表中的一个或多个列定义为用作外键约束。在 REFERENCES 列约束中指定的所有 column-name 必须为主表中的列,必须受唯一约束或主键约束的制约。
CHECK ON COMMIT 仅 UltraLite。不受 UltraLiteJ 支持。强制执行外键约束之前,指定 CHECK ON COMMIT 以使数据库服务器等待 COMMIT。缺省情况下,在插入、更新或删除操作期间会立即强制执行外键约束。但是,设置了 CHECK ON COMMIT 时,即使数据库更改违反外键约束,也可按任意顺序进行数据库更改,可以在出现下一个 COMMIT 之前更正不一致的数据。
unique-key-constraint 子句 指定唯一约束来标识一个或多个唯一标识表中每行的列。表中任何两行的值在所有指定的列中不能相同。表可以有多个唯一约束。
WITH MAX HASH SIZE 为此索引设置散列大小(按字节计)。该值替换对数据库有效的缺省 MaxHashSize 属性。要学习缺省大小,请参见访问 UltraLite 数据库属性。这是不受 UltraLiteJ 支持的。
sync-constraint 子句 指定一个同步约束以确定是否可以同步表。
SYNCHRONIZE 确定是否可以同步表,以及是上载所有行还是仅上载对表的更改。有效值为 ON(默认设置 - 可以同步表,在上载过程中仅发送对表的更改)、OFF(不能同步表,无法将表添加到发布中)和 ALL(仅适用于 UltraLite - 可以同步表,在上载过程中发送表中的所有行)。
除非约束引用表中的多列,否则通常会使用列约束。这些情况下,必须使用表约束。如果语句会导致违反约束,则该语句的执行不会完成。该语句在检测到错误前所做的任何更改都被撤消并报告错误。
表的每一行均有一个唯一主键值。
如果不指定角色名,则按如下方式分配角色名:
如果没有与表名同名的角色名外键,则将表名指派为角色名。
如果表名已被使用,则角色名为表名加上表的唯一三位零填充数字。
模式更改 如果模式更改同时开始,则语句将不会被释放。请参见使用 DDL 语句更改模式。
当 CREATE TABLE 语句正在被处理时,UltraLite 不会处理引用该表的请求或查询。此外,当数据库包含活动查询或未提交的事务时,您也无法执行 CREATE TABLE 语句。
对于 UltraLite.NET 用户:除非也为所有数据对象(例如 ULDataReader)调用了 Dispose 方法,否则您将无法执行此语句。请参见Dispose 方法。
同步外部 BLOB 列(仅适用于 UltraLiteJ)
在统一数据库上,文件名列以常规 CHAR 列的形式存储,BLOB 文件列则以常规 BLOB (LONG BINARY) 列的形式存储。下载时,文件名列会被忽略,并会使用数据库选项 (Connection.OPTION_BLOB_FILE_BASE_DIR) 以及在 DEFAULT AUTOFILENAME 子句中指定的前缀和扩展字符串来生成一个新的文件名。对于 J2SE,语法为 <database_option_blob_file_base_dir><prefix><auto generated integer value>.<extension> and for the BlackBerry the syntax is
<prefix><auto generated integer value>.<extension>
。因此,对于 BlackBerry 而言,生成的文件名始终是相对文件名。
自动提交。
下面的语句为图书馆数据库创建用于保存图书信息的表。
CREATE TABLE library_books ( isbn CHAR(20) PRIMARY KEY, copyright_date DATE, title CHAR(100), author CHAR(50), location CHAR(50), FOREIGN KEY location REFERENCES room ); |
以下语句为图书馆数据库创建用于保存借出图书信息的表。date_borrowed 的缺省值指示在创建条目的当天借出图书。date_returned 列在归还图书前一直为 NULL。
CREATE TABLE borrowed_book ( loaner_name CHAR(100) PRIMARY KEY, date_borrowed DATE NOT NULL DEFAULT CURRENT DATE, date_returned DATE, book CHAR(20), FOREIGN KEY (book) REFERENCES library_books (isbn) ); |
下面的语句将为某销售数据库创建保存订单和订单项信息的表。
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), FOREIGN KEY (order_num) REFERENCES Orders (order_num) ); |
![]() |
使用DocCommentXchange 讨论此页。
|
版权 © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |