1

在 Firebird 中,拥有自动增量列的唯一方法是设置生成器并将其与触发器一起使用。

在 H2 db 中有 auto_increment 和 identity 关键字可以做到这一点。

什么是最好的方法?

Mysql 也使用了 auto_increment,但是 cucurrence read 和 table lock 存在一些问题,不是吗?

谢谢你。

4

1 回答 1

2

不,不存在并发读取和表锁的问题。

使用每个 RDBMS 原生的伪键特性的优点是 RDBMS 引擎以原子方式处理 id 值的分配,因此并发客户端不会分配相同的 id 值。它只需要在内部 id 计数器上短暂锁定,而不是任何整个表。

什么是最好的方法并不重要。您应该使用您正在使用的 RDBMS 提供的功能。不幸的是,伪键直到 SQL:2003 才在 ANSI SQL 标准中定义。到那时,每个供应商都创建了自己的专有特性和语法。

  • Oracle 使用SEQUENCE类似于FirebirdGENERATORSEQUENCE对象的对象。
  • Microsoft SQL ServerIDENTITY用作列选项。
  • IBM DB2 和 PostgreSQL 都支持序列,但它们也有一些声明魔法,可以使列隐式地从序列中获取它们的值。
  • MySQL 使用AUTO_INCREMENTcolumn 选项,并且还支持伪数据类型SERIAL以使其与 PostgreSQL 具有一定的交叉兼容性。
  • SQLite 只是假设任何整数主键列都是自动递增的。

如果 H2 同时支持IDENTITYAUTO_INCREMENT,它可能会让从 MySQL 或 Microsoft SQL Server 迁移的人更熟悉它。我不知道 H2,但我猜这两种语法形式都访问相同的内部功能。

我找到了 H2 的文档。它同时出现IDENTITYAUTO_INCREMENT使用SEQUENCE.

于 2010-05-03T17:35:58.243 回答