4 Stimmen

Mysql Klonen Zeile mit Primärschlüssel

Ich habe eine Mysql-Tabelle mit einem einzigen Primärschlüssel (genannt pkey), der automatisch inkrementiert, und ich möchte eine Zeile klonen, wobei alle Daten gleich bleiben, mit Ausnahme des Primärschlüssels, der der nächste verfügbare Wert werden sollte, wie durch Autoinkrement definiert.

Meine erste Frage ist, ist die folgende Abfrage möglich?

UPDATE `table` SET pkey='next_available_primary_key' WHERE pkey='old_primary_key'

wenn versucht haben

UPDATE `table` SET pkey=null WHERE pkey='old_primary_key'

Dabei wird jedoch nur der Wert des Primärschlüssels auf Null gesetzt. Vielen Dank im Voraus für jede Hilfe/Vorschläge.

UPDATE:

Ich denke, ich sollte hinzufügen, dass ich nicht wirklich zwei Kopien der Daten in der Tabelle möchte. Ich möchte nur den Primärschlüssel ändern. Also, wenn ich INSERT SELECT verwenden würde, müsste ich mit ON DUPLICATE KEY UPDATE pkey='next_available_primary_key' kompensieren, ich bin mir nur nicht sicher, wie man das macht...

0 Stimmen

Nur so aus Neugier: Was ist Ihr Ziel? Es könnte nämlich sein, dass Sie den Primärschlüssel für ein Ziel missbrauchen (z. B. zum Ordnen von Daten), für das er nicht vorgesehen ist.

7voto

O. Jones Punkte 90877

Sie wollen INSERT, nicht UPDATE, wenn Sie versuchen, eine neue Zeile in der Tabelle zu erstellen.

Wie wäre es damit? Vergewissern Sie sich, dass Ihr PKEY auf Autoinkrement eingestellt ist.

INSERT INTO `table` (col,col,col)  /*name all the columns EXCEPT the primary key*/
SELECT col,col,col  /*name all the columns EXCEPT the primary key*/
  FROM 'table`
 WHERE pkey='old_primary_key'

0 Stimmen

So dachte ich über diese, und ich kann bis mit dieser Lösung, aber ich hoffte auf eine sauberere Lösung, wo ich nicht brauchen, um alle Felder außer für den Primärschlüssel aufzulisten.

2 Stimmen

Ich mache viel von dieser Art von Dingen, und ich verwende die Metadaten (information_schema.COLUMNS), um meine Abfrage zu erstellen. COLUMNS.COLUMN_KEY = 'PRI', wenn diese Spalte Teil des Primärschlüssels für die Tabelle ist, ein leerer String, wenn dies nicht der Fall ist.

0 Stimmen

In jedem Fall müssen Sie ein Skript verwenden, um die Abfrage zu erstellen. Und ich denke, Sie müssen auch eine temporäre Tabelle verwenden, je nach Ihrer Datenbank-Engine.

3voto

jspcal Punkte 49141
insert into t select 0,a,b,c,d,e from t where id = some_id

0 als Wert für die auto_increment-Spalte verwenden, wird mysql den nächsten verfügbaren Wert verwenden...

für Ihren neuen Kommentar bearbeitet, wenn Sie die ID auf die nächste verfügbare ändern möchten,

update tbl set id = (select auto_increment from
  information_schema.tables where  table_name = 'tbl') where id = 4;

3voto

Paul Crown Punkte 31

Wie wäre es mit der Lösung, die unter clone-sql-record ?

CREATE TEMPORARY TABLE %1 ENGINE=MEMORY SELECT * FROM mytable WHERE myid=%2;

UPDATE %1 SET myid=%3;

INSERT INTO mytable SELECT * FROM %1;

DROP TABLE %1;

wobei

  • %1 ist "T "+raw_time_stamp, z.B. T20120124132754
  • %2 ist oldid
  • %3 ist eine neue Identität

0voto

Anam Shah Punkte 329

Klonen von Tabellendatensätzen, mit automatisch erhöhtem Primärschlüssel

CREATE TEMPORARY TABLE `tmp` SELECT * FROM `your_table_name`;

UPDATE `tmp` SET id = NULL ;

INSERT INTO `your_table_name` SELECT * FROM `tmp`;

DROP TEMPORARY TABLE IF EXISTS `tmp`;

0voto

s10z Punkte 1025

Beachten Sie, dass die anderen angegebenen Lösungen bei einer Quelltabelle zu funktionieren scheinen, die Null für die Primärschlüsselspalte zulässt. Da dies bei mir nicht der Fall ist, bin ich auf einen Fehler gestoßen, der leicht durch Ändern der temporären Tabelle gelöst werden kann (ich erwartete id der Primärschlüssel sein):

CREATE TEMPORARY TABLE tmp_clone ENGINE=MEMORY 
    SELECT * FROM my_source_table WHERE id=some_id;

ALTER TABLE tmp_clone MODIFY id bigint(20) default null;
UPDATE tmp_clone SET id=null;

INSERT INTO my_source_table SELECT * FROM tmp_clone;

DROP TABLE tmp_clone;

SELECT * from my_source_table where id = last_insert_id();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X