2013-07-12 10 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 ; 
影響を受けZERO行を返します

。また、彼らはグーグルで、引用符にゼロを入れると問題は解決しますが、助けにはならないと言います。毎日の輸入です。

EDIT: 列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桁の整数ではありません。ディスプレイの長さは19で、4バイトの整数(2の32乗)です。表示の長さは表示する桁数です。実際の桁数は何も表示されません。長い話は短いです - 6桁の請求書で始まり、数字を増やしてください。 –

+0

@CBroe、いいえ、ZEROFILは良くありません。なぜなら私は履歴データを持っているからです。 1203は001203に変更され、私は7桁の数字を持っています。だから私は、それぞれの数字の後ろにすべての履歴を変更するだろう – jaczes

答えて

23

私はあなたが読んガイドラインは、請求書は、それががデータベースにを保存する方法を表示し、ないする方法に適用されることを考えるべきだと思います。

数値がINTとして格納されるときは、純粋な数値です。前にゼロを追加してもう一度保存すると、それはまだ同じ番号です。

あなたは次のようにNUMERフィールドを選択、またはそのテーブルのビューを作成することができます。あなたは、データベースからそれを選択したときに

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

か、というよりは、データの変更、ときにゼロと数を水増し考えますそれを表示するときだけ、それを表示します。

私は、過去のデータが同じにとどまるというあなたの要件は疑問点だと思います。履歴データであっても、001203という番号の請求書は、1203という番号の請求書と同じです。

ただし、絶対に記述する必要がある場合は、VARCHARフィールドに変換することができます。変換された履歴データはそのまま保存することができ、新しいエントリは必要な数の0にパディングできます。しかし、私はそれをお勧めしません。

0

分野でテーブルはintカラムなので、数値だけを格納します。テーブル内のデータをパディングする方法はありません。 1 == 001 == 000000000001これは同じ番号です。

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

あなたはまた、LPADとの間でデータを選択することができます:

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

代替を、CBroeは、それが正しく表示されますが、それが行けば、これは変更する必要がありますように、あなたがINT(6) ZEROFILLするデータ型を変更することができます述べたように

2

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

int(6) zerofillに変更すると、読み込むたびにMySQLによって埋め込まれます。

データベースにゼロが実際に格納されるようにするには、タイプをCHAR/VARCHARに変更する必要があります。LPAD更新ステートメントが機能します。