将递增值与其他值一起添加到 Oracle 数据库中的列中

Posted

技术标签:

【中文标题】将递增值与其他值一起添加到 Oracle 数据库中的列中【英文标题】:Add incrementing value together with other values into a column in Oracle database 【发布时间】:2019-12-23 11:52:32 【问题描述】:

我在表 Employee 中有一个已处理的列。处理后的值形成一个字符串:“timestamp”+“employeeID”+一个递增/排序值(即 1、2、3...)。

目标是:

    字符串值是唯一的(递增值) 我可以大致看到它的处理时间(时间戳) 关于哪个员工(employeeID)

我当前的解决方案有一个表,仅用于递增值部分。有一列会查询该值,然后将该值添加到已处理字符串的末尾。在此之后,增量表值将更新为增量值。 它是用 Oracles 序列和触发器函数创建的:见https://chartio.com/resources/tutorials/how-to-define-an-auto-increment-primary-key-in-oracle/

但是,我不认为这个解决方案是最佳的,我想知道如果没有为增加单个值而制作的附加表,是否可以做到这一点?

我正在使用 Oracle Database 19c。

【问题讨论】:

为什么不为所有员工增加价值?为什么每个员工都必须是唯一的? 所以我可以根据 Processed 值查询员工 是的,为什么它必须是单列?为什么不将数据存储在单独的列中? 如果处理值与员工在同一个表中,那么将员工 id 作为处理值的一部分有什么价值。查询将更复杂且性能更低。看来您使事情变得比应有的复杂。是否可以添加一个 processes_date 列和一个 processes_id (这将是那个增加的值)?这为您提供了最大的查询灵活性。如果您仍想在您创建的单个列中查看它,并且连接处理后的日期、处理的 ID 和雇员 ID 的虚拟列 有什么理由让您尝试将其变得如此复杂,而不是简单地为 EMPLOYEE_ID、PROCESSED_TIMESTAMP 和 ID_NUMBER 三个字段(使用序列生成)? 【参考方案1】:

如果您真的关心优化,唯一的解决方案是三列解决方案。一列用于 EMPLOYEE_NO,一列用于处理的 ID,一列用于处理的时间戳。这提供了您需要的所有信息,并且能够按 EMPLOYEE_NO 或按日期查询表,而无需使用子字符串函数。

尚不清楚 PROCESSED 是否必须是单独的表。可以多次处理员工吗?无论如何,这是一个单独的表实现......

create table processed (
    processed_id number generated always as identity primary key
    , employee_no not null references employees
    , processed_ts timestamp default current_timestamp not null
)  

...这里是a demo on db<>fiddle。

【讨论】:

以上是关于将递增值与其他值一起添加到 Oracle 数据库中的列中的主要内容,如果未能解决你的问题,请参考以下文章

熊猫将嵌套值与其他列一起切片

PLS-00103:尝试使用序列递增值时遇到符号 DECLARE/EOF

只要新值与当前值不同,Oracle SQL 将字段的值更改为列表中的其他值?

如何将 Spark/Scala RDD 合并/加入到 List 中,以便 RDD 中的每个值与每个 List 项一起获得一个新行

是否可以将与不同行名关联的值添加在一起,同时保持其他行不变?

oracle的主键要设置默认值为自动递增,怎么处理?