2010-11-11 45 views
2

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

回答

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'编码了一些其他信息,那么它确实应该存储在一个单独的列中(为了显示的目的,您总是可以连接到主键)。

0

您可以简单地插入您希望用作PK的值。

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

我希望它是自动生成的主键...所以我不想每次进入表格时都要这样做 – aherlambang 2010-11-11 20:38:51

+3

我认为您需要更好地解释要求。做你所要求的是增加不必要的开销。你为什么需要PK开始写信? – RedFilter 2010-11-11 20:45:40

+0

可以说我有一个工作人员和一个客户,从前端我希望用户能够通过他们的ID关联一个工作人员和一个客户 – aherlambang 2010-11-12 17:07:06

7

我同意贾斯汀洞穴。 优化程序和索引分布也有副作用。这些可以通过使用具有前导零的固定长度格式(即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'组件作为一个单独的字段,该字段既可以是两列主键的一部分,也可以是不属于该键的属性。