2010-11-11 46 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'組件作爲一個單獨的字段,該字段既可以是兩列主鍵的一部分,也可以是不屬於該鍵的屬性。