SQL ОБНОВИТЬ все значения в поле с добавленной строкой CONCAT не работает

160

Вот что я хочу сделать:

текущая таблица:

+----+-------------+  
| id | data        |  
+----+-------------+  
|  1 | max         |  
|  2 | linda       |  
|  3 | sam         |  
|  4 | henry       |  
+----+-------------+  

Mystery Query (что-то вроде "UPDATE table SET data = CONCAT(data, 'a')")

итоговая таблица:

+----+-------------+  
| id | data        |  
+----+-------------+  
|  1 | maxa        |  
|  2 | lindaa      |  
|  3 | sama        |  
|  4 | henrya      |  
+----+-------------+  

Это оно! Мне просто нужно сделать это в одном запросе, но, похоже, не могу найти способ. Я использую MySQL на BlueHost (я думаю, что его версия 4.1)

Спасибо всем.

Fresheyeball
источник
5
Вы на самом деле пробовали свой запрос? Это должно "просто работать"
Фил
Да, я попробовал это. Я думал, что это должно сработать тоже.
Fresheyeball
вот мое возвращение «из реальной жизни»: [SQL] UPDATE questions_national SET cat_id = CONCAT (cat_id, 'a') Затрагиваемые строки: 0 Время: 0.069ms
Fresheyeball
Является ли cat_idполе символа (varchar, текст и т. Д.) Или числовым?
Фил
не работал для меня (SQL 2012), поэтому я попытался "обновить набор данных = данные + '' 'работает нормально ..
Серебро

Ответы:

258

Это почти все, что вам нужно:

mysql> select * from t;
+------+-------+
| id   | data  |
+------+-------+
|    1 | max   |
|    2 | linda |
|    3 | sam   |
|    4 | henry |
+------+-------+
4 rows in set (0.02 sec)

mysql> update t set data=concat(data, 'a');
Query OK, 4 rows affected (0.01 sec)
Rows matched: 4  Changed: 4  Warnings: 0

mysql> select * from t;
+------+--------+
| id   | data   |
+------+--------+
|    1 | maxa   |
|    2 | lindaa |
|    3 | sama   |
|    4 | henrya |
+------+--------+
4 rows in set (0.00 sec)

Не уверен, почему у вас будут проблемы, хотя я тестирую это на 5.1.41

Марк Б
источник
1
concatФункция 4.1 выглядит так же - dev.mysql.com/doc/refman/4.1/en/...
Фил
12
Решил это. Оказывается, столбец имел ограниченный набор символов, которые он мог бы принять, изменил его, и теперь запрос работает нормально.
Fresheyeball
У меня несколько такой же сенарио, за исключением того, что я хочу заменить все двойные кавычки одинарными. Любые предложения, как я могу это сделать?
Shaonline
Это был хороший ответ, но немного запутанный, поскольку на моем сервере «данные» были ключевым словом. Возможно, менее двусмысленным примером будет:UPDATE table SET column_name=concat(column_name, 'string');
Кики Родригес
38

CONCAT со значением NULL возвращает значение NULL, поэтому самое простое решение:

ОБНОВЛЕНИЕ myTable SET spares = IFNULL (CONCAT (spares, "string"), "string")

andrejc
источник
11
UPDATE mytable SET spares = CONCAT(spares, ',', '818') WHERE id = 1

не работает для меня.

запчасти NULLпо умолчанию, но егоvarchar

DS_web_developer
источник
5
кажется, что если значение по умолчанию равно NULL, оно не работает. это должна быть пустая строка
DS_web_developer
9

преобразовать NULLзначения с пустой строкой, обернув ееCOALESCE

"UPDATE table SET data = CONCAT(COALESCE(`data`,''), 'a')"

ИЛИ

Вместо этого используйте CONCAT_WS :

"UPDATE table SET data = CONCAT_WS(',',data, 'a')"
Рохан Худе
источник
8

Решил это. Оказывается, столбец имел ограниченный набор символов, которые он мог бы принять, изменил его, и теперь запрос работает нормально.

Fresheyeball
источник
8
UPDATE 
    myTable
SET 
    col = CONCAT( col , "string" )

Не мог решить это. Синтаксис запроса был корректным, но "0 строка затронута" при выполнении.

Решение было:

UPDATE 
    myTable 
SET 
    col = CONCAT( myTable.col , "string" )

Это сработало.

Джереми Тилле
источник
2

Ты можешь сделать это:

Update myTable
SET spares = (SELECT CASE WHEN spares IS NULL THEN '' ELSE spares END AS spares WHERE id = 1) + 'some text'
WHERE id = 1

поле = поле + значение не работает, когда поле пустое.

Эрик
источник
Можете ли вы действительно использовать + со строками в MySQL?
Судхир N