2009-10-27 4 views
5

У меня есть таблица, и я хочу дублировать определенные строки в таблице. Я знаю, что это не лучший способ сделать что-то, но мы ищем быстрое решение.Дублировать запись в MySQL

Вот что-то сложнее, чем я изначально думал, все, что мне нужно сделать, это скопировать всю запись в новую запись в таблице автоматического увеличения в MySql без необходимости указывать каждое поле. Это связано с тем, что таблица может измениться в будущем и может нарушить дублирование. Я буду дублировать записи MySQL из PHP.

Это проблема, потому что в запросе «SELECT *» MySql попытается скопировать идентификатор копируемой записи, которая генерирует дублируемую идентификационную ошибку.

Это блокирует: INSERT INTO customer SELECT * FROM customer WHERE customerid=9181. Он также блокирует INSERT INTO customer (Field1, Field2, ...) SELECT Field1, Field2, ..... FROM customer WHERE customerid=9181.

Есть ли способ сделать это с PHP или MySQL?

ответ

12

Я, наконец, нашел этот код. Я уверен, что это поможет людям в будущем. Так вот оно.

function DuplicateMySQLRecord ($table, $id_field, $id) { 
    // load the original record into an array 
    $result = mysql_query("SELECT * FROM {$table} WHERE {$id_field}={$id}"); 
    $original_record = mysql_fetch_assoc($result); 

    // insert the new record and get the new auto_increment id 
    mysql_query("INSERT INTO {$table} (`{$id_field}`) VALUES (NULL)"); 
    $newid = mysql_insert_id(); 

    // generate the query to update the new record with the previous values 
    $query = "UPDATE {$table} SET "; 
    foreach ($original_record as $key => $value) { 
    if ($key != $id_field) { 
     $query .= '`'.$key.'` = "'.str_replace('"','\"',$value).'", '; 
    } 
    } 
    $query = substr($query,0,strlen($query)-2); # lop off the extra trailing comma 
    $query .= " WHERE {$id_field}={$newid}"; 
    mysql_query($query); 

    // return the new id 
    return $newid; 
} 

Вот ссылка на статью http://www.epigroove.com/posts/79/how_to_duplicate_a_record_in_mysql_using_php

+1

Я попытался использовать его, и есть ошибка с функцией foreach. –

0

Как насчет копирования строк в таблицу темп, а затем обратно в таблицу клиентов? Я думаю, что это заставит mysql дать ему новый идентификатор автоинкремента, особенно со второй версией запроса, который вы опубликовали.

1

насчет

insert into test.abc select null, val1, val2 from test.abc where val2 = some_condition; 

Кажется, работает для меня, как это. Замените свой стол, поля, состояние, конечно.

Нуль позволяет БД генерировать идентификатор автоинкремента для вас.

+0

Недостатком является то, что у меня есть жесткий код val1, val2 и т. Д. Есть ли способ не иметь этот жесткий код? – Pasta

+0

Да, это недостаток. Я бы предпочел программно определить имена столбцов и построить соответствующую инструкцию вставки «на лету», чтобы избежать жесткого кодирования столбцов. «SHOW COLUMNS FROM table» предоставит вам эту информацию, и в результатах этого вызова есть столбец «Поле» и «Ключ». Хотя я не разработчик PHP, я подозреваю, что вы можете сделать вызов, чтобы получить имена столбцов, вычеркнуть непервичные ключевые поля и построить инструкцию insert из этого. Не пробовал, но подозреваю, что это сработает. – itsmatt

0

Два сообщения до сих пор, и вот третий вариант: в PHP динамически определяют поля в вашей таблице. Или вы можете сделать список массивов полей, которые вы «жестко-кодируете», поддерживать вручную, чтобы отразить таблицу. Ваш результирующий запрос не будет использовать *.

1

Варианты:

  1. Избегайте использования * подстановочные, и указать все столбцы самостоятельно. Но вы говорите, что таблица, как ожидается, изменится в будущем, и это не приемлемое решение для вашего дела.

  2. Интроспекция столбцов из определения текущей таблицы (с использованием DESCRIBE или путем запроса INFORMATION_SCHEMA.COLUMNS). Используйте эту информацию о метаданных для построения запроса, опустив столбец первичного ключа автоматического увеличения.

  3. Выполняйте запрос SELECT *, верните строку обратно в приложение и удалите из него столбец автоматического увеличения. Затем используйте этот кортеж, чтобы построить оператор INSERT.

Короче говоря, у вас есть сложное требование для адаптации к изменяющимся метаданным. Вероятно, это невозможно сделать в одном запросе.

0

Если вы знаете имя первичного ключа столбца в таблице (и я предполагаю, что вы делаете, потому что это в где положение в любом случае), Я думаю, вы могли бы это сделать:

Редактировать - Я забыл, что MySQL не поддерживает select ... in. Это должно работать вместо

create new_table 
select * 
from customer 
where customerid = 9181 

alter table new_table 
drop column customerid 

insert into customer 
select null, * 
from new_table 

drop table new_table 
Смежные вопросы