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 的用法 » 创建数据库 » 使用事务和隔离级别

 

主键生成和并发

您可能会遇到数据库应自动生成唯一编号的情况。例如,如果您正在构建一个用于存储销售发票的表,您可能希望数据库自动指派唯一的发票编号,而不希望让销售人员随意指定。

示例

例如,可以通过在前一个发票编号上加 1 来获取发票编号。如果有多人同时在数据库中添加发票,则不能使用这种方法。两个雇员可能会决定使用相同的发票编号。

这个问题有多种解决方法:

  • 为每个添加新发票的人指派一个发票编号范围。

    您可以通过创建一个具有用户名列和发票编号列的表来实施这种方案。每个添加发票的用户在该表中都将有一行。用户每次添加发票时,该表中的编号将递增,并用于新添加的发票。为处理数据库中的所有表,该表应具有三列:表名、用户名和最后的键值。应定期验证每个人是否有足够的编号。

  • 创建一个具有以下两列的表:表名和最后的键值。

    此表中有一行包含使用的最后一个发票号。每次有人添加发票时,将建立一个新连接,递增该表中的编号,然后立即提交更改。递增后的编号可以用于新添加的发票。其他用户仍可以取得发票编号,因为您使用了一个单独的事务来更新该行,而且这个事务很快就已完成。

  • 使用带有 NEWID 的缺省值及 UNIQUEIDENTIFIER 二进制数据类型的列可生成全局唯一标识符。

    UUID 和 GUID 值可用于标识表中的唯一行。在一台计算机上所生成的值与在其它计算机上生成的值不相同。因此,可将它们用作复制和同步环境中的键。

    有关生成唯一标识符的详细信息,请参见NEWID 缺省值

  • 使用缺省值为 AUTOINCREMENT 的列。例如:

    CREATE TABLE Orders (
       OrderID INTEGER NOT NULL DEFAULT AUTOINCREMENT,
       OrderDate DATE,
       primary key( OrderID )
    );

    每次在表中插入行时,如果没有为自动增量列指定值,将生成一个唯一的值。如果指定了一个值,将使用指定的值。如果指定的值大于该列的当前最大值,将使用指定的值作为以后插入行时自动递增的起点。自动增量列中最近插入的行的值可以用全局变量 @@identity 表示。