我希望我在oracle中的表的主键以字母开头.主键是nvharchar.可能的主键可以是:S1,S291912873123,S123123123.我怎样才能做到这一点?触发?任何例子?
我同意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"组件作为单独的字段,该字段是两列主键的一部分或者根本不是键的一部分的属性.
您是否始终希望在生成的主键前加上"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'对其他一些信息进行编码,那么它确实应该存储在一个单独的列中(为了显示目的,你总是可以连接到主键).
| 归档时间: |
|
| 查看次数: |
1340 次 |
| 最近记录: |