2013-07-12 66 views
6

我有發票號碼的表。指南指出,數字應該有6位或更多位數。首先嚐試做:帶領先零的LPAD

UPDATE t1 SET NUMER=CONCAT('00000',NUMER) WHERE LENGTH(NUMER)=1; 
UPDATE t1 SET NUMER=CONCAT('0000',NUMER) WHERE LENGTH(NUMER)=2; 
UPDATE t1 SET NUMER=CONCAT('000',NUMER) WHERE LENGTH(NUMER)=3; 
UPDATE t1 SET NUMER=CONCAT('00',NUMER) WHERE LENGTH(NUMER)=4; 
UPDATE t1 SET NUMER=CONCAT('0',NUMER) WHERE LENGTH(NUMER)=5; 

但這並不高效,甚至漂亮。我試過LPAD功能,但隨後而來的問題,因爲功能:

UPDATE t1 SET NUMER=LPAD(NUMER,6,'0') WHERE CHAR_LENGTH(NUMER)<=6 ; 

返回零行不受影響。也google搜索,他們說,把零放入報價將解決問題,但沒有,有任何幫助?這是每日進口。

編輯: 柱NUMER是INT(19)和已經包含像數據:

NUMER 
---------- 
1203 
12303 
123403 
1234503 
... 

(它是由現在填充有從3到7位不同長度的數據)

+2

你的'NUMER'列有什麼數據類型?並且不使用數字值上的'ZEROFILL'屬性不能解決您的問題了嗎? http://dev.mysql.com/doc/refman/5.5/en/numeric-type-attributes.html – CBroe

+0

您無法更新INT列以包含可變數量的前導/尾隨零。另外,INT(19)是毫無意義的。這不是一個19位數的整數。它是一個4字節的整數(2的32次冪),顯示長度爲19.顯示長度與它所說的一樣 - 它將顯示多少位數,因此它對數字的實際長度沒有影響。長話短說 - 從6位數的發票開始,並不斷增加數字。 –

+0

@CBroe,不,ZEROFIL不好,因爲我有例如歷史數據。 1203改爲001203,我有7位數字。所以我會改變每個數字後面的所有歷史數字 – jaczes

回答

23

我想你應該考慮您閱讀指引適用於發票應如何顯示,而不是它應該如何存儲在數據庫中。

當一個數字被存儲爲INT時,它是一個純數字。如果您在前面添加零並再次存儲,它仍然是相同的數字。

您可以選擇最NUMER領域如下,或創建該表的視圖:

SELECT LPAD(NUMER,6,'0') AS NUMER 
FROM ... 

或者,而不是改變,當你從數據庫中選擇它的數據,可以考慮用零當填充數你顯示它,並且只有當你顯示它時。

我認爲您對歷史數據保持不變的要求是一個有爭議的問題。即使是歷史數據,編號爲001203的發票與編號爲1203的發票相同。

但是,如果您絕對必須按照您描述的方式執行此操作,那麼轉換爲VARCHAR字段可能會有效。轉換後的歷史數據可以原樣存儲,並且任何新條目都可以填充到所需數量的零。但我不建議這樣做。

0

領域中該表是一個int列,因此它只存儲一個數字。無法填充表格中的數據。 1 == 001 == 000000000001.這是相同的數字。

您應該在應用程序級別(將數據從表格中拉出的系統)執行填充。訂單號超過999999時會發生什麼?然後您必須更新表中的所有數據以添加額外的0.這種事情不應該在數據庫級別完成。

您也可以選擇出來的數據與LPAD:

SELECT LPAD(NUMER,6,'0'), [other_columns] FROM t1; 

的選擇,因爲CBroe提到你可以改變數據類型爲INT(6) ZEROFILL使其顯示正確,但是這將需要被修改,如果去如上所述999999以上..

2

UPDATE t1 SET NUMER=LPAD(NUMER,6,'0') WHERE CHAR_LENGTH(NUMER)<=6 ;不會做你期望的,因爲NUMER字段是int。它將從int 1234創建字符串'0',然後將其轉換回1234 - 這就是爲什麼沒有改變。

NUMER更改爲int(6) zerofill,每次讀取它時,MySQL都會爲您填充它。

如果你真的想要零存儲在數據庫中,你必須改變類型爲CHAR/VARCHAR,那麼你的LPAD更新語句將工作。