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

SQL Anywhere 12.0.1 » UltraLite - 数据库管理和参考 » UltraLite 用作 MobiLink 客户端 » UltraLite 客户端 » UltraLite 中的主键唯一性

 

在 UltraLite 中使用 GLOBAL AUTOINCREMENT

您可将 UltraLite 数据库中某列的缺省值声明为 GLOBAL AUTOINCREMENT 类型。但必须先为 UltraLite 数据库设置全局数据库 ID 才能自动递增这些列 ID。

小心

通过 MobiLink 同步下载的 GLOBAL AUTOINCREMENT 列值不会更新 GLOBAL AUTOINCREMENT 值计数器。因此,如果一个 MobiLink 客户端将某值插入到另一客户端的分区,可能会发生错误。要避免此问题,请确保 UltraLite 应用程序的每个副本都仅将值插入到其自己的分区。

 ♦ 在 UltraLite 数据库中声明 GLOBAL AUTOINCREMENT 列
  1. 为数据库的每个副本都指派一个唯一的全局 ID 号。

    global_database_id 数据库选项在 UltraLite 数据库中设置该值。在部署 UltraLite 时,必须为每个数据库指派一个不同的标识号。

  2. 允许 UltraLite 使用由 UltraLite 数据库编号唯一标识的分区向列提供缺省值。UltraLite 遵循以下规则:

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

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

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

      例如,如果为 UltraLite 数据库指派的全局 ID 为 1 并且分区大小为 1000,则将在范围 1001-2000 中选择该数据库的缺省值。如果为数据库另一副本指派的标识号为 2,则向同一列提供的缺省值的范围将为 2001-3000。

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

    • 如果未设置全局 ID 值,或者用尽分区中的值,则将 NULL 值插入列。如果不允许 NULL 值,则尝试插入行将会引起错误。

  3. 如果已用尽或很快就要用尽声明为 GLOBAL AUTOINCREMENT 的列的可用值,则需要设置新的全局数据库 ID。UltraLite 会从全局 ID 号所标识的分区中选择 GLOBAL AUTOINCREMENT 值,但只能等到达到最大值的时候。如果超出这些值,UltraLite 便开始生成 NULL 值。通过指派新的全局数据库 ID 号,UltraLite 可设置其它分区中相应的值。

    选择新全局数据库 ID 的一个方法是维护未用的全局数据库 ID 值的池。该池的维护与主键池的维护方法相同。

    提示

    UltraLite API 提供了获取已用编号的比例的方法。返回值是 0-100 范围内的 SHORT 类型数字,代表迄今为止已使用的值的百分比。例如,值为 99 表示几乎没有剩下尚未使用的值,应为数据库指派一个新标识号。设置此标识号的方法因使用的编程接口而异。

 另请参见