我有发票号码表。指南说数字应该有6位或更多位数。首先尝试做:
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 ;
返回受影响的ZERO行。也谷歌搜索,他们说把零写入报价将解决问题,但没有,任何帮助?这是每日导入。
编辑: 列NUMER是INT(19)并且已经包含如下数据:
NUMER
----------
1203
12303
123403
1234503
...
(现在填充的数据长度从3到7位不等)
答案 0 :(得分:29)
我认为您应该考虑您所阅读的指南适用于发票应如何显示,而不应该如何存储在数据库中。
当一个数字存储为INT时,它是一个纯数字。如果您在前面添加零并再次存储它,它仍然是相同的数字。
您可以按如下方式选择NUMER字段,或为该表创建一个视图:
SELECT LPAD(NUMER,6,'0') AS NUMER
FROM ...
或者,不是在从数据库中选择数据时更改数据,而是考虑在显示数字时用零填充数字,并且仅在显示数字时填充。
我认为您对历史数据保持不变的要求是一个有争议的问题。即使是历史数据,编号为001203的发票也与编号为1203的发票相同。
但是,如果您绝对必须按照描述的方式执行此操作,则转换为VARCHAR字段可能会起作用。转换的历史数据可以按原样存储,任何新条目都可以填充到所需的零数。但我不建议这样做。
答案 1 :(得分:2)
UPDATE t1 SET NUMER=LPAD(NUMER,6,'0') WHERE CHAR_LENGTH(NUMER)<=6 ;
字段为NUMER
, int
将无法达到预期效果。它将从int 1234创建字符串'001234',然后将其转换回1234 - 这就是为什么没有变化。
将NUMER
更改为int(6) zerofill
类型,每次阅读时,MySQL都会为您填写。
如果您确实希望存储在数据库中的零,则必须将类型更改为CHAR
/ VARCHAR
,然后您的LPAD
更新语句才能生效。
答案 2 :(得分:0)
表中的字段是一个int列,因此它只存储一个数字。没有办法填写表格中的数据。 1 == 001 == 000000000001。这是相同的数字。
您应该在应用程序级别(从表中提取数据的系统)执行填充。当订单号超过999999时会发生什么?然后,您必须更新表中的所有数据以添加额外的0.这种事情不应该在数据库级别完成。
您还可以使用LPAD选择数据:
SELECT LPAD(NUMER,6,'0'), [other_columns] FROM t1;
替代方案,正如CBroe所提到的,您可以将数据类型更改为INT(6) ZEROFILL
,以便正确显示,但如果它超过999999,则必须进行修改。