我们有如下表。
CREATE TABLE "STYLES" (
"STYLE_CODE" CHAR(8) GENERATED ALWAYS AS
("COLOR"||"FEATURE"||"SIZE"||"YEAR")
VIRTUAL NOT NULL ENABLE,
"COLOR" CHAR(2),
"FEATURE" CHAR(2),
"SIZE" CHAR(2),
"YEAR" CHAR(2),
"SEQ" CHAR(2),
CONSTRAINT "STYLE_CODE_PK" PRIMARY KEY
("STYLE_CODE") USING INDEX ENABLE
) ;
如果上表中STYLE_CODE PK的值不重复,则生成的SEQ值始终为00
如果STYLE_CODE PK的值重复,我们希望SEQ值按01、02的顺序增加。
我想找到解决办法。谢谢。
序列对象不是这样工作的:它们旨在产生唯一的值。这些值可能存在间隙,或者(在某些情况下,例如 Oracle RAC)甚至是无序的。您需要为每个可能的 STYLE_CODE 和/或具有手动行锁定的复杂业务逻辑提供单独的序列,而这种手动行锁定无法很好地扩展 - 如果两个用户同时添加具有相同 STYLE_CODE 的新行怎么办?推荐一个单独的 PK 列,该列只是序列生成的数字,以 STYLE_CODE 作为属性,并且(在您的情况下)基于数据类型的值的单个列,而不是每个值都不同。此外,您的 STYLE_CODE 虚拟列表达式似乎无效;它应该是 CASE 语句、计算或返回派生值的内容,而不仅仅是可接受值的列表。
如果您必须具有用于报告目的的复合样式字段,请考虑此处描述的方法:https ://stackoverflow.com/questions/67914853/how-to-set-an-autoincrement-composite-primary-key-in-oracle19c和看看它是否可以适应您的目的。它不会将字段相关计数器存储在数据库中,而是将其生成作为查询的一部分。
或者,考虑将每种类型保存在单独的表中,每种类型都有自己的计数器和适当的属性。
另外几句话的建议:
YEAR
切勿像SEQ
字符一样存储数字;始终将它们存储为数字(另外,始终使用 4 位数年份)。