Как говорится в заголовке, im пытается добавить string
в столбец VARCHAR
в моей таблице. Строка – это что-то вроде «// string», передняя косая черта будет использоваться позже, чтобы взорвать строку в массив в PHP. Мне было интересно, если в MYSQL есть способ выполнить CONCAT(columnname, "//string")
если столбец пуст, в противном случае выполните нормальное UPDATE ... SET ... WHERE
. Таким образом, я буду избегать первого значения моей будущей взорванной строки как «// string» с форвардными slahes.
Кроме того, выше я использовал жирные символы для « в MYSQL », потому что я знаю, что могу сначала запросить БД (чтобы проверить, является ли столбец пустым) с чем-то вроде:
$q = $conn->dbh->prepare('SELECT columnname FROM tablename WHERE username=:user'); $q->bindParam(':user', $username); $q->execute(); $check = $q->fetchColumn();
а затем оставьте PHP решить, какая операция выполняется:
if ($check != '') { // PERFORM A CONCAT } else { // PERFORM AN UPDATE }
но это будет означать пустую трату времени / ресурсов из-за 2x запросов к базе данных и большего количества кода PHP.
Благодарю.
https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
Это означает, что в вашем случае:
INSERT INTO tablename (id,columnname) VALUES (1,'//string') ON DUPLICATE KEY UPDATE columnname=CONCAT(columnname,'//string');
http://sqlfiddle.com/#!9/bd0f4/1
ОБНОВЛЕНИЕ Просто чтобы показать вам свои варианты:
http://sqlfiddle.com/#!9/8e61c/1
INSERT INTO tablename (id, columnname) VALUES (1, '//string') ON DUPLICATE KEY UPDATE columnname=CONCAT(columnname,'//string'); INSERT INTO tablename (id, columnname) VALUES (1, '//string') ON DUPLICATE KEY UPDATE columnname=CONCAT(columnname,'//string'); INSERT INTO tablename (id, columnname) VALUES ((SELECT id FROM tablename t WHERE columnname='blahblah'), '//string') ON DUPLICATE KEY UPDATE columnname=CONCAT(columnname,'//string'); INSERT INTO tablename (id, columnname) VALUES ((SELECT id FROM tablename t WHERE id=2), '//string') ON DUPLICATE KEY UPDATE columnname=CONCAT(columnname,'//string'); INSERT INTO tablename (id, columnname) VALUES ((SELECT id FROM tablename t WHERE columnname='newone'), '//newone') ON DUPLICATE KEY UPDATE columnname=CONCAT(columnname,'//newone');
Если вы хотите, то это:
первая строка: столбец будет содержать 'firststring'
Вторая строка: столбец будет содержать 'firststring // secondstring'
затем выполните обновление следующим образом:
UPDATE tablename SET columnname = CONCAT( IF(IFNULL(columnname,'')='','',CONCAT(columnname,'//')), :string) WHERE username=:user