database - [H2 and Firebird]auto_increment, identity or trigger plus generator?

标签 database firebird auto-increment h2

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

在 H2 数据库中,有 auto_increment 和 identity 关键字可以做到这一点。

什么是最好的方法?

mysql也用auto_increment,但是并发读和表锁有一些问题,是不是?

谢谢。

最佳答案

没有,没有并发读和表锁的问题。

使用每个 RDBMS native 的伪键功能的优点是 RDBMS 引擎以原子方式处理 id 值的分配,因此并发客户端不会分配相同的 id 值。它只需要对内部 ID 计数器进行短暂锁定,而不需要对整个表进行锁定。

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

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

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

我找到了 H2 的文档。 IDENTITYAUTO_INCREMENT 似乎都使用了 SEQUENCE .

关于database - [H2 and Firebird]auto_increment, identity or trigger plus generator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2759750/

相关文章:

sql - 在 Firebird 脚本中创建表导致 "unsuccessful metadata update"出现死锁

java - 整数递增并与字符串连接

mysql - 如何设置 AUTO_INCREMENT 字段以在 MySQL 中以值 6000 开头?

c# - 提高 C# 中 SQL SELECT 的性能

sql - 删除sql数据库的bat文件

数据库字符限制代码点火器

PHP Firebird API : php_interbase or PDO?

sql - 在 firebirdsql 中连接三个表

sql-server - 删除后重置 SQL Server 中的自动增量

sql-server - 我们可以在其他服务器上使用同义词吗?