2013-07-12 5 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 ; 

возвращает нулевое значение строки пострадавших. Также googled, и они говорят, что положить ноль в кавычки решит проблему, но не помогло? Это ежедневный импорт.

РЕДАКТИРОВАТЬ: Колонка 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. Он создаст строку '0' из int 1234, а затем вернет ее обратно в 1234 - вот почему нет изменений.

Изменить NUMER на номер int(6) zerofill и MySQL будет загружать его для вас каждый раз, когда вы его читаете.

Если вы действительно хотите, чтобы нули, хранящиеся в базе данных, вы должны изменить тип на CHAR/VARCHAR, тогда ваш оператор обновления LPAD будет работать.

Смежные вопросы