2015-01-16 2 views
1

Учитывая следующую структуру таблицы:Дублирование строки в MySQL без перекодирования для изменения базы данных

ID 
Field1 
Field2 
Field3 

Я хотел бы дублировать запись в таблице. Псевдо-код будет выглядеть примерно так:

DUPLICATE * IN MyTable WHERE ID = 3 

Вот мои ограничения:

  1. Я не хочу идентификатор дублируется.
  2. Я не сейчас, сколько полей или их типов находятся в таблице.

Я не хочу сделать это в PHP.

ответ

2

Вы можете использовать оператор select для вставки строк. Если вы хотите вставить новую строку со всеми одинаковыми значениями, просто напишите инструкцию select, чтобы получить нужные значения. Попробуйте что-то вроде этого:

INSERT INTO myTable (field1, field2, field3) 
    SELECT field1, field2, field3 FROM myTable WHERE id = 3; 

Вот пример SQL Fiddle.

EDIT

Если вы не знаете, сколько полей, вариант у вас есть, чтобы использовать временную таблицу. См. Это, например, article. Причина, по которой вам нужна временная таблица, заключается в том, что вы не можете просто повторно вставить строку, потому что у вас будет двойная ошибка ключа. Таким образом, логика будет следующей: добавьте строку в новую таблицу, измените идентификатор, вставьте дублируемую строку с новым идентификатором в старую таблицу и отпустите временную таблицу.

Предполагая, что столбец id is auto_increment, вы можете установить новый идентификатор на текущий максимальный id + 1. Вам не нужно это делать, но до тех пор, пока у вас есть способ обновления идентификатора до чего-то, что не существует, это будет работать. Попробуйте вместо этого:

CREATE TEMPORARY TABLE temp SELECT * FROM myTable WHERE id = 3; 
UPDATE temp SET id = (SELECT MAX(id) FROM myTable) + 1; 
INSERT INTO myTable SELECT * FROM temp; 
DROP TABLE temp; 

Вот еще один пример SQL Fiddle.

+2

Как вы делаете SQL-скрипты так быстро? Мне нужно вечно создавать таблицы и вставлять случайные значения и прочее ... – Shahar

+0

@Shahar Я отвечаю на многие вопросы MySQL, так что это стало привычкой ха-ха. ctrl + c и ctrl + v - ваши друзья. – AdamMc331

+1

@Shahar Также окно _Text to DDL_ является дружественным. – Barmar

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