MySQL bir yinelenen kayıt

6 Cevap php

Ben bir tablo var ve ben tabloda belirli satırları çoğaltmak istiyorum. Ben bu şeyler yapmak için en iyi yol değildir biliyorum ama biz hızlı bir çözüm arıyoruz.

Burada başlangıçta düşündüğünüzden daha zor bir şey, yapmam gereken bütün her alanını belirtmek için gerek kalmadan MySql otomatik artışlı tablosunda yeni bir rekor için bütün kopya kayıt olduğunu. Tablo gelecekte değiştirebilir ve tekrarını bozabilecek çünkü bu. Ben PHP MySQL kayıtlarını çoğaltarak edilecektir.

Bir 'SELECT *' sorgu MySQL yinelenen bir kimlik hatası genenerates kopyalanan kayıt kimliğini kopyalamak için çalışacağız çünkü bir sorundur.

This blocks out: INSERT INTO customer SELECT * FROM customer WHERE customerid=9181. It also blocks out INSERT INTO customer (Field1, Field2, ...) SELECT Field1, Field2, ..... FROM customer WHERE customerid=9181.

PHP ve MySQL bu yapmak için bir yolu var mı?

6 Cevap

Sonunda bu kodu bulundu. Ben gelecekte insanlara yardımcı olacaktır eminim. Yani burada.

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;
}

İşte makalenin link http://www.epigroove.com/posts/79/how%5Fto%5Fduplicate%5Fa%5Frecord%5Fin%5Fmysql%5Fusing%5Fphp

Ne hakkında

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

Böyle benim için iş gibi görünüyor. Tabii ki tablo yerine, alanlar, koşul.

Boş DB sizin için otomatik artış kimlik oluşturmak sağlar.

Nasıl geri müşteri tabloya daha sonra bir geçici tabloya satır kopyalama ve hakkında? Ben özellikle deftere sorgunun ikinci sürümü ile, ona yeni bir değiştirmemesi kimliği vermek için mysql zorlayacaktır düşünüyorum.

İki mesaj şimdiye kadar, ve burada bir 3. seçenek: PHP, dinamik tablodaki alanları belirler. Yoksa, size "sert-kodu" tablosunu yansıtmak için elle korumak alanlarda bir dizi listesini yapabilirsiniz. Sizin edilen sorgu * kullanmaz.

Eğer tablodaki birincil anahtar sütunu adını biliyor (ve yine nerede yan tümcesi, çünkü ben bunu tahmin ediyorum), ben bunu düşünüyorum:

Düzenleme - MySQL içine ... seçeneğini desteklemiyor unuttum. Bu yerine çalışması gerekir

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