13

請求書番号の表があります。ガイドラインによると、数字は 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 ;

影響を受けたゼロ行を返します。また、ググると、引用符にゼロを入れると問題が解決すると言われていますが、助けにはなりませんでしたか? 毎日輸入です。

編集: 列 NUMER は INT(19) であり、次のようなデータが既に含まれています:

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

(今では3桁から7桁までの異なる長さのデータで満たされています)

4

3 に答える 3

37

あなたが読んだガイドラインは、請求書をデータベースに保存する方法ではなく、請求書を表示する方法に適用されることを考慮する必要があると思います。

数値が INT として格納されている場合、それは純粋な数値です。前にゼロを追加して再度格納すると、同じ番号のままです。

次のように NUMER フィールドを選択するか、そのテーブルのビューを作成できます。

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

または、データベースからデータを選択するときにデータを変更するのではなく、表示するときだけ数値をゼロで埋めることを検討してください。

履歴データを同じままにするという要件は、議論の余地があると思います。履歴データであっても、番号 001203 の請求書は番号 1203 の請求書と同じです。

ただし、説明した方法で絶対に行う必要がある場合は、VARCHAR フィールドへの変換が機能する場合があります。変換された履歴データはそのまま保存でき、新しいエントリは必要な数のゼロにパディングできます。しかし、私はそれをお勧めしません。

于 2013-07-12T11:03:20.300 に答える
4

UPDATE t1 SET NUMER=LPAD(NUMER,6,'0') WHERE CHAR_LENGTH(NUMER)<=6 ;NUMERフィールドが であるため、期待どおりに動作しませんint。int 1234 から文字列 '001234' を作成し、それを 1234 にキャストします。これが変更がない理由です。

NUMERtypeを変更するint(6) zerofillと、MySQL は読み取るたびにパディングします。

データベースにゼロを保存したい場合は、タイプをCHAR/に変更する必要があります。そうすればVARCHARLPAD更新ステートメントが機能します。

于 2013-07-12T10:54:23.743 に答える
0

テーブルのフィールドは int 列なので、数値を格納するだけです。テーブル内のデータを埋める方法はありません。1 == 001 == 000000000001. これは同じ数字です。

パディングはアプリケーション レベル (テーブルからデータを引き出すシステム) で行う必要があります。注文番号が 999999 を超えるとどうなりますか? 次に、テーブル内のすべてのデータを更新して、余分な 0 を追加する必要があります。この種のことは、データベース レベルで行うべきではありません。

LPAD を使用してデータを選択することもできます。

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

代わりに、CBroe が述べたように、INT(6) ZEROFILL正しく表示されるようにデータ型を変更できますが、上記のように 999999 を超える場合は変更する必要があります..

于 2013-07-12T10:52:51.707 に答える