Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.
您可能会遇到数据库应自动生成唯一编号的情况。例如,如果您正在构建一个用于存储销售发票的表,您可能希望数据库自动指派唯一的发票编号,而不希望让销售人员随意指定。
例如,可以通过在前一个发票编号上加 1 来获取发票编号。如果有多人同时在数据库中添加发票,则不能使用这种方法。两个雇员可能会决定使用相同的发票编号。
这个问题有多种解决方法:
为每个添加新发票的人指派一个发票编号范围。
您可以通过创建一个具有用户名列和发票编号列的表来实施这种方案。每个添加发票的用户在该表中都将有一行。用户每次添加发票时,该表中的编号将递增,并用于新添加的发票。为处理数据库中的所有表,该表应具有三列:表名、用户名和最后的键值。应定期验证每个人是否有足够的编号。
创建一个具有以下两列的表:表名和最后的键值。
此表中有一行包含使用的最后一个发票号。当用户每次添加发票时,发票号将自动递增,接着建立一个新的连接,然后递增发票号或立即提交更改。因为行是通过一个单独事务即时更新的,所以其他用户可以访问新的发票号。
使用带有 NEWID 的缺省值及 UNIQUEIDENTIFIER 二进制数据类型的列可生成全局唯一标识符。
您可以使用 UUID 和 GUID 值唯一地标识表行。由于在一台计算机上生成的值与在另一台计算机上生成的值不匹配,因此可以在复制和同步环境中将 UUID 和 GUID 值用作关键字。
使用缺省值为 AUTOINCREMENT 的列。例如:
CREATE TABLE Orders ( OrderID INTEGER NOT NULL DEFAULT AUTOINCREMENT, OrderDate DATE, primary key( OrderID ) );
每次在表中插入行时,如果没有为 AUTOINCREMENT 列指定值,将生成一个唯一的值。如果指定了一个值,将使用指定的值。如果指定的值大于该列的当前最大值,将使用指定的值作为以后插入行时自动递增的起点。AUTOINCREMENT 列中最近插入的行的值可以用全局变量 @@identity 表示。
使用序列来生成唯一值