域是内置数据类型的别名,包括适用的精度值和小数位数值,还可以包括 DEFAULT 值和 CHECK 条件。SQL Anywhere 中预先定义了一些域(如货币数据类型),但您也可以添加更多自己的域。
域(也称为用户定义的数据类型)使整个数据库中的列都可以自动定义成相同的数据类型,具有相同的 NULL 或 NOT NULL 条件、相同的 DEFAULT 设置和相同的 CHECK 条件。域有利于整个数据库的一致性,并且可以消除一些错误类型。
域使用 CREATE DOMAIN 语句进行创建。有关语法的完整说明,请参见CREATE DOMAIN 语句。
以下语句创建一个名为 street_address 的数据类型,这是一个有 35 个字符的字符串。
CREATE DOMAIN street_address CHAR( 35 ); |
CREATE DATATYPE 可代替 CREATE DOMAIN 使用,但不建议这样做。
创建数据类型时需要资源权限。创建某个数据类型后,执行 CREATE DOMAIN 语句的用户 ID 就是该数据类型的所有者。任何用户都可以使用该数据类型。与其它数据库对象不同的是,所有者名称从来不用作数据类型名的前缀。
在定义列时,street_address 数据类型的使用方式与任何其它数据类型完全相同。例如,在以下有两列的表中,第二列为 street_address 列:
CREATE TABLE twocol ( id INT, street street_address ); |
域可以被其所有者或具有 DBA 权限的用户使用 DROP DOMAIN 语句进行删除:
DROP DOMAIN street_address; |
只有当数据库中的任何表中都未使用该数据类型时,才能执行此语句。如果尝试删除正在使用的域,会显示消息 [表 'SYSUSERTYPE' 中行的主键正在另一个表中被引用]。
可以在域中构建许多与列关联的属性,如允许 NULL 值、具有 DEFAULT 值等。以该数据类型定义的任何列都会自动继承 NULL 设置、CHECK 条件和 DEFAULT 值。这样就能以一种类似的含义在整个数据库的列中构建一致性。
例如,SQL Anywhere 示例数据库中的许多主键列是保存 ID 号的整数列。以下语句创建的数据类型可能会对此类列有帮助:
CREATE DOMAIN id INT NOT NULL DEFAULT AUTOINCREMENT CHECK( @col > 0 ); |
缺省情况下,使用 id 数据类型创建的列不允许为 NULL,其缺省值为自动递增值,而且必须保存正数。在 @col 变量中,可以使用任何标识符取代 col。
可以通过显式地提供列的属性来替换该数据类型的属性。无论 id 数据类型的设置为何,以数据类型 id 创建并显式地允许 NULL 值的列都允许使用 NULL 值。
命名约束和缺省值 在 SQL Anywhere 中,创建的域具有基本数据类型,也可以具有 NULL 或 NOT NULL 条件、缺省值和 CHECK 条件。不支持命名约束和命名缺省值。
创建数据类型 在 SQL Anywhere 中,可以使用 sp_addtype 系统过程添加域,也可以使用 CREATE DOMAIN 语句。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |