在 Firebird 中,拥有自动增量列的唯一方法是设置生成器并将其与触发器一起使用。
在 H2 数据库中,有 auto_increment 和 identity 关键字可以做到这一点。
什么是最好的方法?
mysql也用auto_increment,但是并发读和表锁有一些问题,是不是?
谢谢。
最佳答案
没有,没有并发读和表锁的问题。
使用每个 RDBMS native 的伪键功能的优点是 RDBMS 引擎以原子方式处理 id 值的分配,因此并发客户端不会分配相同的 id 值。它只需要对内部 ID 计数器进行短暂锁定,而不需要对整个表进行锁定。
什么是最好的方法并不重要。您应该使用您正在使用的 RDBMS 提供的功能。不幸的是,直到 SQL:2003,伪键才在 ANSI SQL 标准中定义。到那时,每个供应商都创建了自己的专有功能和语法。
- Oracle 使用类似于 Firebird
GENERATOR
orSEQUENCE
的SEQUENCE
对象对象。 - Microsoft SQL Server 使用
IDENTITY
作为列选项。 - IBM DB2 和 PostgreSQL 都支持序列,但它们也有一些声明性的魔法,可以使列隐式地从序列中获取它们的值。
- MySQL 使用
AUTO_INCREMENT
列选项,还支持伪数据类型SERIAL
以使其与 PostgreSQL 具有一定的交叉兼容性。 - SQLite 只是假定任何整数主键列都是自动递增的。
如果 H2 同时支持 IDENTITY
和 AUTO_INCREMENT
,这可能会让从 MySQL 或 Microsoft SQL Server 迁移过来的人更熟悉它。我不知道 H2,但我猜这两种语法形式都访问相同的内部功能。
我找到了 H2 的文档。 IDENTITY
和 AUTO_INCREMENT
似乎都使用了 SEQUENCE
.
关于database - [H2 and Firebird]auto_increment, identity or trigger plus generator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2759750/