oracle主键以字母开头

ahe*_*ang 2 sql oracle

我希望我在oracle中的表的主键以字母开头.主键是nvharchar.可能的主键可以是:S1,S291912873123,S1​​23123123.我怎样才能做到这一点?触发?任何例子?

Gar*_*ers 7

我同意Justin Cave的看法.优化器和索引分布也有副作用.通过使用带前导零的固定长度格式(即S0000913,S0000914,S0000915而不是S913,S914,S915)可以最小化这些

当索引块为"满"并且需要拆分以添加密钥时,如果块位于索引的右侧大小,则它将被分割为90/10.否则它会得到50-50的分割.如果你有一堆键,如S9,S90,S91,S92 ...... S904 ......,那么你可以达到S6034或者什么,你得到50-50分(因为你已经获得了所有那些S9条目)右手边).

同样,当面对范围扫描时,'S6034'适合'S6'和'S7',但6034不适合6到7之间.

三思而后行.替代解决方案可以是将"S"组件作为单独的字段,该字段是两列主键的一部分或者根本不是键的一部分的属性.


Jus*_*ave 6

您是否始终希望在生成的主键前加上"S"?或者是否有一些额外的算法来确定使用什么字母?或者你希望这封信随着时间的推移而递增?

如果你只是在'S'之前,你可以做类似的事情

CREATE SEQUENCE your_pk_seq;

CREATE TRIGGER trg_populate_pk
  BEFORE INSERT ON your_table_name
  FOR EACH ROW
BEGIN
  SELECT 'S' || to_char( your_pk_seq.nextval )
    INTO :new.primary_key_column
    FROM dual;
END;
Run Code Online (Sandbox Code Playgroud)

但我通常会警告不要这样做.如果要生成合成主键,则不应该关心格式.在功能上对你来说无论是数字,GUID还是其他东西都无关紧要.由于Oracle提供序列以便有效地生成数字合成密钥,因此您真的应该让合成主键成为数字.如果'S'对其他一些信息进行编码,那么它确实应该存储在一个单独的列中(为了显示目的,你总是可以连接到主键).