oracle主键以字母开头

时间:2010-11-11 20:28:57

标签: sql oracle

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

3 个答案:

答案 0 :(得分:7)

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

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

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

三思而后行。另一种解决方案可能是将“S”组件作为单独的字段,该字段可以是两列主键的一部分,也可以是不属于键的属性。

答案 1 :(得分: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;

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

答案 2 :(得分:0)

您只需插入您希望用作PK的值。

INSERT INTO MYTABLE (PK) values ('S291912873123')