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

SQL Anywhere 11.0.1 (中文) » MobiLink - 服务器管理 » 使用 MobiLink 服务器技术 » 同步技术 » 维护唯一主键 » 使用全局自动增量

 

设置全局数据库 ID

在部署应用程序时,必须为每个数据库指派一个不同的标识号。您可以通过多种方法来创建和分发标识号。一种方法是将值放置在表中,并根据某些其它的唯一属性(例如远程 ID)将合适的行下载到每个数据库。

♦  设置全局数据库标识号
如何选择缺省值

全局数据库 ID 在 SQL Anywhere 中使用公共选项 global_database_id 来设置,而在 UltraLite 中使用 global_id 选项来设置。

每个数据库中的全局数据库 id 选项都必须设置为唯一的非负整数。某一特定数据库的缺省值范围是从 pn + 1 到 p(n + 1),其中 p 为分区大小,而 n 为全局数据库 ID 的值。例如,如果分区大小为 1000 而全局数据库 ID 设置为 3,则范围就是从 3001 到 4000。

SQL Anywhere 和 UltraLite 使用以下规则选择缺省值:

  • 如果在当前分区中列不包含任何值,则第一个缺省值为 pn + 1,其中 p 为分区大小,而 n 为全局数据库 ID 的值。

  • 如果列包含当前分区中的值,但都小于 p(n + 1),则下一个缺省值为该范围内上一个最大值加 1。

  • 缺省列值不受列中当前分区外的值的影响;也就是说,不受小于 pn + 1 或大于 p(n + 1) 的值的影响。如果通过 MobiLink 同步从另一个数据库中复制了这些值,则这些值就可能存在。

如果全局数据库 ID 设置为缺省值 2147483647,则将向该列插入一个空值。如果不允许空值,则插入行的尝试将导致错误。例如,如果列包含在表的主键中,便会发生这种情况。

因为全局数据库 ID 不能设置为负值,所以所选值始终为正数。最大标识号仅受列数据类型和分区大小的限制。

当分区内的可用值用完时,也会生成空缺省值。在此情况下,应向数据库指派一个新全局数据库 ID 值,以允许从其它分区选择缺省值。如果该列不允许使用空值,则插入空值的尝试将导致错误。要检测提供的未使用值是否太小并处理此情况,可创建一个 GlobalAutoincrement 类型的事件。

如果一个特定分区中的值已接近用完,您可以为该数据库指派一个新的全局数据库 ID。您可以使用任何简便的方式指派新的数据库 ID。但是,一种可行的方法是维护未使用的数据库 ID 值的池。该池的维护与主键池的维护方法相同。

可以设置一个事件处理程序,在分区快要用尽时自动通知数据库管理员(或执行其它操作)。有关 SQL Anywhere 数据库的信息,请参见定义事件的触发条件

另请参见
示例

在 SQL Anywhere 数据库中,以下语句将数据库标识号设置为 20。

SET OPTION PUBLIC.global_database_id = 20

如果特定列的分区大小为 5000,则在 100001-105000 范围内选择此数据库的缺省值。