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 的用法 » 创建数据库 » 确保数据完整性 » 使用列缺省值

 

GLOBAL AUTOINCREMENT 缺省值

GLOBAL AUTOINCREMENT 缺省值专用于在 SQL Remote 复制或 MobiLink 同步环境中使用多个数据库的情况。它可确保多个数据库间的主键的唯一性。

此选项类似于 AUTOINCREMENT,只不过要对域进行分区。每个分区都包含相同数目的值。为每个数据库副本指定一个唯一全局数据库标识号。SQL Anywhere 只从用数据库编号唯一标识的分区中提供数据库中的缺省值。

分区大小可以为任意正整数,但分区大小的选择通常要保证任何一个分区内的编号资源尽量不被用尽(如果曾有过这种情况)。

对于 BIGINT 或 UNSIGNED BIGINT 类型的列,缺省分区大小是 232 = 4294967296;对于所有其它类型的列,缺省分区大小是 216 = 65536。由于这些缺省值可能不合适(尤其当列不是 INT 或 BIGINT 类型时),因此最好显式指定分区大小。

使用此选项时,每个数据库中的公共选项 global_database_id 的值必须设置为唯一的非负整数。该值唯一标识数据库,并指示从哪个分区分配缺省值。允许的值范围是 np + 1 到 (n + 1) p,其中 n 是公共选项 global_database_id 的值,p 是分区大小。例如,如果将分区大小定义为 1000 并将 global_database_id 设置为 3,则该范围将是 3001 到 4000。

如果上一个值小于 (n + 1) p,则下一个缺省值将比列中的上一个最大值大一。如果列不包含任何值,则第一个缺省值为 np + 1。缺省列值不受当前分区之外的列值的影响,即不受小于 np + 1 或大于 p(n + 1) 的数的影响。如果通过 MobiLink 同步从另一个数据库中复制了这些值,则这些值就可能存在。

由于不能将公共选项 global_database_id 设置为负值,因此所选值始终是正数。最大标识号仅受列数据类型和分区大小的限制。

如果将公共选项 global_database_id 设置为缺省值 2147483647,则在列中插入 NULL 值。如果不允许使用 NULL 值,则尝试插入行时将出错。例如,如果列包含在表的主键中,便会发生这种情况。

当分区内的可用值用完时,也会生成 NULL 缺省值。在这种情况下,应为数据库指派一个新的 global_database_id 值,以便可以从另一个分区中选择缺省值。如果列不允许使用 NULL 值,则尝试插入 NULL 值时将出错。若要检测提供的未用值是否过小并处理此情况,请创建一个 GlobalAutoincrement 类型的事件。请参见了解事件

全局自动增量列通常是主键列,或限制为包含唯一值的列(请参见实施实体完整性)。

虽然在其它情况下可以使用全局自动增量缺省值,但这样做可能反而导致数据库性能降低。例如,在各列的下一个值存储为 64 位有符号整数的情况下,使用大于 231 - 1 的值或较大的双精度值或数字值可能会导致返转为负值。

您可以使用 @@identity 全局变量来检索插入到自动增量列中的最新值。有关详细信息,请参见@@identity 全局变量

另请参见