java - 使用触发器生成 ID 与手动创建 ID

标签 java sql oracle hibernate

如果我们有一个序列来为表生成唯一 ID 字段,这两种方法中哪一种更有效:

  1. 在插入时创建触发器,通过从序列中获取 nextval 来填充 ID 字段。
  2. 在将对象(或元组)插入数据库之前,对应用程序层中的序列调用 nextval。

编辑:应用程序执行批量上传。因此,假设每次应用程序运行时要插入数千或几百万行。 #1 中的触发器会比 #2 中提到的在应用程序内调用序列更有效吗?

最佳答案

由于您要插入大量行,最有效的方法是将 sequence.nextval 包含在 SQL 语句本身中,即

INSERT INTO table_name( table_id, <<other columns>> )
  VALUES( sequence_name.nextval, <<bind variables>> )

INSERT INTO table_name( table_id, <<other columns>> )
  SELECT sequence_name.nextval, <<other values>>
    FROM some_other_table

如果您使用触发器,您将针对插入的每一行强制将上下文从 SQL 引擎转移到 PL/SQL 引擎(然后再返回)。如果单独获取 nextval,则将强制为每一行进行一次到数据库服务器的额外往返。如果您执行一次或两次,这些都不会特别昂贵。不过,如果您执行数百万次,那么毫秒加起来就是实时时间。

关于java - 使用触发器生成 ID 与手动创建 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12928692/

相关文章:

java - 通过以太网转换器连接RS485设备

java - JFace SWT TableViewer 中的图像和文本

sql - 使用 SQL max() 查找平均评分最高的电影

使用 LIKE 和 CONCAT 的 MySQL/ORACLE 性能

java - Hibernate 为 Oracle 生成导致 ORA-02014 的查询

java - 如何将字符从 Oracle 编码为 XML?

Java Tab 键顺序 : setFocusTraversalPolicy

java - 使用ADT的Postfix的双链接双栈Java

sql - 如何通过避免在所有表中重复出现的某些列来从 SQL Server 2008 中的多个表中选择列名

sql - Oracle:如何限制 "select .. for update skip locked"中的行数