2016-12-26 1 views
2

У меня есть следующий столбец, десятичное (20,2) в таблицах MySQL:Update десятичного столбец, чтобы больше цифр после запятой

no 
10.01 
10.09 
10.10 
10.11 
10.19 
10.99 

Что это самый простой способ обновить это десятичное значение для:

no 

10.001 
10.009 
10.010 
10.011 
10.099 
.. 
10.100 
10.101 

Если я изменил столбец в десятичную (20,3), я получаю следующие цифры: 10.010,10.090 ... 10,990 и т.д. Каждый номер должен быть уникальным. Если MySQL не может этого сделать, как это сделать, используя php?

+0

Не выглядит как настоящий требование – GurV

+0

Хмм, преобразовать в VARCHAR и чем str_replace (». "" .0" , нет) ... и преобразовать в десятичную (20,3) .. Может быть, вы правы: D –

+0

не будет работать для '10.100' – GurV

ответ

0

Я хотел бы сделать это, как показано ниже

  • Сначала взять резервную копию таблицы.
  • Затем добавьте новый столбец с десятичной точкой (20,3)
  • Затем обновите столбец со значением из старого столбца, выполнив некоторую операцию строки.
  • Оставьте старую колонку
  • Переименуйте новый столбец.

Вот тест

mysql> create table test (no decimal(20,2)); 
Query OK, 0 rows affected (0.20 sec) 

mysql> insert into test values('10.01'),('10.09'),('10.10'),('10.11'),('10.19'),('10.99'); 
Query OK, 6 rows affected (0.03 sec) 
Records: 6 Duplicates: 0 Warnings: 0 

mysql> select * from test; 
+-------+ 
| no | 
+-------+ 
| 10.01 | 
| 10.09 | 
| 10.10 | 
| 10.11 | 
| 10.19 | 
| 10.99 | 
+-------+ 
6 rows in set (0.00 sec) 

mysql> alter table test add column no_new decimal(20,3); 
Query OK, 0 rows affected (0.38 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> select * from test; 
+-------+--------+ 
| no | no_new | 
+-------+--------+ 
| 10.01 | NULL | 
| 10.09 | NULL | 
| 10.10 | NULL | 
| 10.11 | NULL | 
| 10.19 | NULL | 
| 10.99 | NULL | 
+-------+--------+ 
6 rows in set (0.00 sec) 

Тогда

mysql> update test set no_new = concat(substring_index(no,'.',1),'.',concat('0',substring_index(no,'.',-1))); 
Query OK, 6 rows affected (0.05 sec) 
Rows matched: 6 Changed: 6 Warnings: 0 

mysql> select * from test; 
+-------+--------+ 
| no | no_new | 
+-------+--------+ 
| 10.01 | 10.001 | 
| 10.09 | 10.009 | 
| 10.10 | 10.010 | 
| 10.11 | 10.011 | 
| 10.19 | 10.019 | 
| 10.99 | 10.099 | 
+-------+--------+ 
6 rows in set (0.00 sec) 

mysql> alter table test drop column no; 
Query OK, 0 rows affected (0.36 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> alter table test change no_new no decimal(20,3); 
Query OK, 0 rows affected (0.08 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> select * from test ; 
+--------+ 
| no  | 
+--------+ 
| 10.001 | 
| 10.009 | 
| 10.010 | 
| 10.011 | 
| 10.019 | 
| 10.099 | 
+--------+ 
6 rows in set (0.00 sec) 
+0

Он работает без единого уникального индекса. Благодарю. –

0
*****Using MySql***** 

--> SELECT FORMAT('COLUMN NAME',DECIMAL VALUE); 

    *****FOR EXAMPLE:***** 

--> SELECT FORMAT(NO,3); 


     *****QUERY***** 

     Create table '#test1' 
     (no decimal(5,3)); 

insert into '#test1' values 
('10.01'), 
('10.09'), 
('10.10'), 
('10.11'), 
('10.19'), 
('10.99'); 

     ****RESULT**** 
      [![DEMO IMAGE][1]][1] 

    [1]: https://i.stack.imgur.com/AzZpB.jpg 
2

вы можете использовать запрос, как это. сначала установите ваше поле в десятичное (20,3): сделайте это в 2 этапа: сначала добавьте также 1, чтобы предотвратить дублирование записей. второй вычитают 1

первый шаг

UPDATE youtTable 
set val = 
    CAST(val as unsigned integer) +1 
    + (val - CAST(val as unsigned integer))/10; 

второй этап

UPDATE youtTable 
set val = val -1; 

, но вы также можете сделать это с одним запросом, если вы меняете наименьшее число первых:

UPDATE yourTable 
set val = 
    CAST(val as unsigned integer) 
    + (val - CAST(val as unsigned integer))/10 
ORDER by val ASC; 

образец

mysql> SELECT CAST(10.19 as unsigned integer) + (10.19 - CAST(10.19 as unsigned integer))/10; 
+----------------------------------------------------------------------------------+ 
| CAST(10.19 as unsigned integer) + (10.19 - CAST(10.19 as unsigned integer))/10 | 
+----------------------------------------------------------------------------------+ 
|                  10.019000 | 
+----------------------------------------------------------------------------------+ 
1 row in set (0,00 sec) 

mysql> 
+0

Каждый номер должен быть уникальным ( –

+0

@ Вадим Носырев - да, в чем проблема: каждый номер уникален до обновления и после обновления, или вы хотите установить новые числа в поле? –

+0

. Пример 509.100 и 509.010. querry 509.100 должен измениться на 509.010, а у меня ошибка. Дублировать запись «509.010».Он отлично работает, если удалить уникальный индекс –

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