пытаясь переименовать дубликаты в базе данных MySQL до сих пор с использованием этого кода, но это только добавление 1 в конец имени. Поэтому, если у меня есть
UPDATE phpfox_photo n JOIN (SELECT title_url, MIN(photo_id) min_id FROM phpfox_photo GROUP BY title_url HAVING COUNT(*) > 1) d ON n.title_url = d.title_url AND n.photo_id <> d.min_id SET n.title_url = CONCAT(n.title_url, '1'); Anna Anna Anna
Результат:
Anna Anna1 Anna11
Когда я получил 200 Annas результат, это Anna111111111111111111111111111111111111111111111 …. и т. Д.
как это сделать, чтобы переименовать в следующем inc
Anna Anna1 Anna2
если я не пропустил что-то, вы можете сделать хранимая процедура, которая итерации бросает ваши строки с помощью курсоров, чтобы сделать это следующим образом:
DECLARE counter INT DEFAULT 0; DECLARE num_rows INT DEFAULT 0; DECLARE offset INT; DECLARE title_urlvalue VARCHAR(50); DECLARE no_more_rows BOOLEAN; DECLARE ucur CURSOR FOR SELECT UPDATE phpfox_photo n JOIN (SELECT title_url, MIN(photo_id) min_id FROM phpfox_photo GROUP BY title_url HAVING COUNT(*) > 1) d ON n.title_url = d.title_url AND n.photo_id <> d.min_id; SET offset = 1; SET no_more_rows = TRUE; select FOUND_ROWS() into num_rows; OPEN ucur; uloop: LOOP FETCH ucur if counter >= num_rows then no_more_rows = False; endif INTO title_urlvalue; IF no_more_rows THEN CLOSE ucur; LEAVE uloop; END IF; update title_urlvalue = Concat(title_urlvalue,offset); SET offset = offset + 1; SET counter = counter + 1; END LOOP uloop; close ucur;
С пользовательскими переменными
SET @counter:=0; SET @title_url:=''; UPDATE phpfox_photo n JOIN (SELECT title_url, MIN(photo_id) min_id FROM phpfox_photo GROUP BY title_url HAVING COUNT(*) > 1) d ON n.title_url = d.title_url AND n.photo_id <> d.min_id SET n.title_url = IF(n.title_url <> @title_url, CONCAT(@title_url:=n.title_url, @counter:=1), CONCAT(n.title_url, @counter:=@counter+1));
Возможно, вы можете использовать modulo для создания нумерации, как это (пример SQLite, но должен быть аналогичным в mysql):
SELECT *, (rowid % (SELECT COUNT(*) FROM table as t WHERE t.name = table.name ) ) FROM table ORDER BY name
Все, что вам нужно, это перевести функцию rowid
и modulo, доступную в mysql.
Затем вы можете получить результаты CONCAT
по вашему желанию.
UPDATE phpfox_photo n JOIN (SELECT title_url, MIN(photo_id) min_id FROM phpfox_photo GROUP BY title_url HAVING COUNT(*) > 1 ) d ON n.title_url = d.title_url AND n.photo_id <> d.min_id SET n.title_url = CASE WHEN <last char is int> THEN <replace last char with incremented last char> ELSE <string + 1> END