MySQLでは、1つの行をコピーして同じテーブルに挿入できますか?


162
insert into table select * from table where primarykey=1

同じテーブルに挿入するために1つの行をコピーしたいだけです(つまり、テーブルの既存の行を複製したい)が、 "select"の後にすべての列をリストする必要なくこれを実行したいのです。列が多すぎます。

しかし、これを行うと、エラーが発生します。

キー1のエントリ 'xxx'が重複しています

これを処理するには、コピーするレコードの一時コンテナーと同じ列を持つ別のテーブルを作成します。

create table oldtable_temp like oldtable;
insert into oldtable_temp select * from oldtable where key=1;
update oldtable_tem set key=2;
insert into oldtable select * from oldtable where key=2;

これを解決する簡単な方法はありますか?


キーのハードコーディングされた値についてのコメントがあります。私はmax(oldtable.id) + oldtable_temp.keyこのようにして、IDがインクリメントされ、一意であることを確認します。
モグラビ男13年


@OrganicAdvocateこれはその質問より多くの回答とより多くの見解を持っています
Drew

回答:


189

Leonard Challisの手法をいくつかの変更を加えて使用しました。

CREATE TEMPORARY TABLE tmptable_1 SELECT * FROM table WHERE primarykey = 1;
UPDATE tmptable_1 SET primarykey = NULL;
INSERT INTO table SELECT * FROM tmptable_1;
DROP TEMPORARY TABLE IF EXISTS tmptable_1;

一時テーブルとして、複数のレコードがあってはならないので、主キーについて心配する必要はありません。これをnullに設定すると、MySQLが値自体を選択できるため、重複を作成するリスクがありません。

確実に挿入したい行が1つしかない場合は、INSERT INTO行の最後にLIMIT 1を追加します。

一時テーブル名に主キー値(この場合は1)も追加したことに注意してください。


3
このソリューションは、MySQLが主キーの値を選択できるようにするという点で(投票を得た他のソリューションとは対照的に)正しいです。
Jan Hettich 2013

1
一貫性のない一時テーブル名(tmptable_1vs tmptable)が原因で、そのままでは機能しませんが
Kieran Tully

9
主キーをnullにするにはどうすればよいですか?
Imran Shafqat 2013

5
nullの場合、挿入時に次のAI番号が自動的に割り当てられます。
グリム...

2
IMRAN-あなたはよく聞くかもしれません。おそらく、一時テーブルのidフィールドは自動的にPKにならないと思いました(SQL Serverがこれらの状況でそうしないと確信しています)。ALTER TABLE tmptable_1 MODIFY primarykeyINT NULL を実行する必要がありました。ソリューションを機能させるための最初の行の後
DJDave 2017

61

アップデート07/07/2014-私の回答に基づくGrim ...による回答は、以下の私のソリューションを改善するため、より良いソリューションです。そのため、それを使用することをお勧めします。

次の構文ですべての列をリストせずにこれを行うことができます。

CREATE TEMPORARY TABLE tmptable SELECT * FROM table WHERE primarykey = 1;
UPDATE tmptable SET primarykey = 2 WHERE primarykey = 1;
INSERT INTO table SELECT * FROM tmptable WHERE primarykey = 2;

別の方法で主キーを変更することもできます。


16
これは基本的に、実際の一時テーブルではありますが、OPが独自の問題に対してすでに提供していたものと同じソリューションであり、作成パターンが少しすっきりしています。OP は、既存の構文のクリーンアップではなく、すでに使用しているものへのより良いアプローチを求めたと思います。これに対する賛成票をすべて理解してはいけません。
Sepster

ありがとうございました。ダイナミックな機能でうまくいく
Sonal Khunt

このプロセスが終了したら、tmptableを削除する必要がありますか?
SSH

「デフォルトでは、データベース接続が終了すると、すべての一時テーブルがMySQLによって削除されます。その間に一時テーブルを削除したい場合は、DROP TABLEコマンドを発行して実行してください。」詳細はこちら
LeonardChallis 2013年

を作成したtmptableのでWHERE primarykey = 2、最後の行にもステートメントを追加する必要はありません。(つまり、ただINSERT INTO table SELECT * FROM tmptable。)
Marcus

42

新しいレコードに新しいレコードが欲しいと思いprimarykeyますか?場合primarykeyであるAUTO_INCREMENTその後、ちょうどこの操作を行います。

INSERT INTO table (col1, col2, col3, ...)
SELECT col1, col2, col3, ... FROM table
  WHERE primarykey = 1

... col1, col2, col3, ...は、を除く 表のすべての列ですprimarykey

AUTO_INCREMENT列ではなく、新しい値を選択できるようにしたい場合もprimarykey同様です。

INSERT INTO table (primarykey, col2, col3, ...)
SELECT 567, col2, col3, ... FROM table
  WHERE primarykey = 1

... 567はの新しい値ですprimarykey


41
それが質問を無視するとき、なぜこれが7回賛成されるのですか?...しかし、「選択」の後にすべての列をリストする必要はありません。これは、このテーブルに列が多すぎるためです...
LeonardChallis

7
-1はこれがまさにOPが避けたいものだからです。質問を読むか、少なくとも「これが唯一の可能な方法」のような答えを出します。
devios1 2012

5
時々質問自体が間違っているからです。:)コンテンツを変更せずに行を複製すると、冗長性が向上します。可能であれば、データベース構造を変更して冗長性を最小限に抑えることをお勧めします。
Torben、

5
それが通常の慣行の下で正しくないからといって、それが間違っているわけではありません。標準のベストプラクティスが適用されない場合がたくさんあります。例:データベースはドキュメントを表し、ユーザーは変更を加える前にドキュメントのコピーを保持する必要があります。
ima747 2013年

6
このページはOPとまったく同じ望んでいないに上陸する可能性があるため
jx12345

13

最初のクエリではほとんど列を指定するだけで済みます。そのため、挿入で主キーを除外して、テーブルにある可能性のある自動インクリメントを実行して、自動的に新しい主キーを作成できます。エントリ。

たとえば、これを変更します。

insert into table select * from table where primarykey=1

これに:

INSERT INTO table (col1, col2, col3) 
SELECT col1, col2, col3 
FROM table 
WHERE primarykey = 1

クエリのINSERTまたはSELECT部分​​の列リストに主キー列を含めないでください。


1
selectステートメントを通じてほとんどの列をプルする方法はありますが、insertコマンドでそれらの1つを手動で更新しますか?などinsert into table ("val1", col2, col3) select col2, col3 from table where primarykey = 1または類似した何か?
anon58192932

1
それを見つけた!insert文の中に独自の値のいずれかを1行の値をコピーしますが、追加:stackoverflow.com/questions/23971078/...
anon58192932

1
ごめんなさい、あなたの質問が通知されました。
ブレーデンブラック

9

テーブルをダンプし、挿入コマンドを見つけて編集することもできます。

mysqldump -umyuser -p mydatabase --skip-extended-insert mytable > outfile.sql

は、--skip-extended-insert行ごとに1つの挿入コマンドを提供します。次に、お気に入りのテキストエディタで行を見つけ、コマンドを抽出して、主キーを「デフォルト」に変更します。


2
私からの+1。これは、「ボックスの外」の優れたアプローチであり、状況によっては、実行時以外でも実際に役立つ場合があります。しかし、主にそれは実際にOPの質問に対処する最初の回答であり、OPによってすでに提供されているソリューションを構文的に微調整するだけではありません。
Sepster

6

この手順では、次のことを前提としています。

  • _duplicate_temp_tableがありません
  • あなたの主キーはintです
  • テーブルを作成するアクセス権があります

もちろん、これは完璧ではありませんが、特定の(おそらくほとんどの)場合には機能します。

DELIMITER $$
CREATE PROCEDURE DUPLICATE_ROW(copytable VARCHAR(255), primarykey VARCHAR(255), copyid INT, out newid INT)
BEGIN
        DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @error=1;
        SET @temptable = '_duplicate_temp_table';
        SET @sql_text = CONCAT('CREATE TABLE ', @temptable, ' LIKE ', copytable);
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SET @sql_text = CONCAT('INSERT INTO ', @temptable, ' SELECT * FROM ', copytable, ' where ', primarykey,'=', copyid);
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SET @sql_text = CONCAT('SELECT max(', primarykey, ')+1 FROM ', copytable, ' INTO @newid');
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SET @sql_text = CONCAT('UPDATE ', @temptable, ' SET ', primarykey, '=@newid');
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SET @sql_text = CONCAT('INSERT INTO ', copytable, ' SELECT * FROM ', @temptable, '');
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SET @sql_text = CONCAT('DROP TABLE ', @temptable);
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SELECT @newid INTO newid;
END $$
DELIMITER ;

CALL DUPLICATE_ROW('table', 'primarykey', 1, @duplicate_id);
SELECT @duplicate_id;

1
+1これは確認されてworksいませんが、アプローチは妥当であり、ここではユニークであり、実際にOPの質問に対処するため価値があります。
Sepster、

5

これは、いくつかの創造性で達成できます。

SET @sql = CONCAT('INSERT INTO <table> SELECT null, 
    ', (SELECT GROUP_CONCAT(COLUMN_NAME) 
    FROM information_schema.columns 
    WHERE table_schema = '<database>' 
    AND table_name = '<table>' 
    AND column_name NOT IN ('id')), ' 
from <table> WHERE id = <id>');  

PREPARE stmt1 FROM @sql;
EXECUTE stmt1;

これにより、選択された行のIDではなく、自動増分されたIDが新しい行に取得されます。


これは受け入れられる答えになるはずです!
フェリペデジデラーティ

5

テーブルの主キーフィールドが自動インクリメントフィールドである場合、列を使用したクエリを使用できます。たとえば、という名前のテーブルにtest_tblは、3つのフィールドがありid, name, ageます。idは主キーフィールドであり、自動インクリメントであるため、次のクエリを使用して行を複製できます。

INSERT INTO `test_tbl` (`name`,`age`) SELECT `name`,`age` FROM `test_tbl`;

このクエリの結果、すべての行が複製されます。


テーブルの主キーフィールドが自動インクリメントフィールドでない場合は、次の方法を使用できます。

INSERT INTO `test_tbl` (`id`,`name`,`age`)
  SELECT 20,`name`,`age` FROM `test_tbl` WHERE id = 19;

このクエリの結果は、id=19として挿入されたの重複した行ですid=20


INSERT INTO:それがある最高の答えです、ケースは非常に簡単ですtableNamefieldName1fieldName2fieldName3)を選択しfieldName1fieldName2fieldName3FROM tableNameWHERE 1(一度にそれらのすべてをコピーする)
jakubplus

出向-この答えは簡潔で、実際に行を「コピー」するという精神に基づいています。
user37309

4

更新フィールドと自動インクリメント値を持つ行の複製

CREATE TEMPORARY TABLE `temp` SELECT * FROM `testing` WHERE id = 14;

UPDATE `temp` SET id = (SELECT id FROM testing ORDER by id DESC LIMIT 1
 )+1, user_id = 252 ,policy_no = "mysdddd12" where id = 14;

INSERT INTO `testing` SELECT * FROM `temp`;

DROP TEMPORARY TABLE IF EXISTS `temp`;

@Torben質問の左側にあるチェックマークをチェックして(承認済みとしてマークしてください)、問題が解決したことを全員に知らせてください。
HosseyNJF

3

以下のいくつかはこのサイトから収集されました。これは、任意の数のフィールドを持つテーブルのレコードを複製するために行ったものです。

これは、テーブルの先頭にAIフィールドがあることも前提としています

function duplicateRow( $id = 1 ){
dbLink();//my db connection
$qColumnNames = mysql_query("SHOW COLUMNS FROM table") or die("mysql error");
$numColumns = mysql_num_rows($qColumnNames);

for ($x = 0;$x < $numColumns;$x++){
$colname[] = mysql_fetch_row($qColumnNames);
}

$sql = "SELECT * FROM table WHERE tableId = '$id'";
$row = mysql_fetch_row(mysql_query($sql));
$sql = "INSERT INTO table SET ";
for($i=1;$i<count($colname)-4;$i++){//i set to 1 to preclude the id field
//we set count($colname)-4 to avoid the last 4 fields (good for our implementation)
$sql .= "`".$colname[$i][0]."`  =  '".$row[$i]. "', ";
}
$sql .= " CreateTime = NOW()";// we need the new record to have a new timestamp
mysql_query($sql);
$sql = "SELECT MAX(tableId) FROM table";
$res = mysql_query($sql);
$row = mysql_fetch_row($res);
return $row[0];//gives the new ID from auto incrementing
}

2

私はこれに遅れるかもしれませんが、私のために働いた同様の解決策があります。

 INSERT INTO `orders` SELECT MAX(`order_id`)+1,`container_id`, `order_date`, `receive_date`, `timestamp` FROM `orders` WHERE `order_id` = 1

これにより、一時テーブルなどを作成する必要がなくなります。行が同じテーブルにコピーされるため、Max(PK)+1関数を簡単に使用できます。

私はこの質問の解決策を探しに来て(構文を忘れていました)、自分でクエリを作成することになりました。物事が時々うまくいくおかしい。

よろしく


2

主キーが自動インクリメントの場合、主キー以外の各フィールドを指定するだけです。

INSERT INTO table(field1,field2,field3) SELECT (field1,field2,field3) FROM table WHERE primarykey=1


2

@LeonardChallisのソリューションを更新しました。他のソリューションでは解決できなかったためです。WHERE句とSET primaryKey = 0一時テーブルを削除して、MySQLがprimaryKeyを自動インクリメントするようにしました

CREATE TEMPORARY TABLE tmptable SELECT * FROM myTable;
UPDATE tmptable SET primaryKey = 0;
INSERT INTO myTable SELECT * FROM tmptable;

もちろん、これはテーブル内のすべての行を複製するためのものです。


2

私はグリムの手法を少し変更して使用しました。このクエリを探している誰かが主キーの問題のために単純なクエリを実行できないためである場合:

INSERT INTO table SELECT * FROM table WHERE primakey=1;

MySqlインストール5.6.26では、キーをnullにできず、エラーが発生します。

#1048 - Column 'primakey' cannot be null 

したがって、一時テーブルを作成した後、主キーをnull可能に変更します。

CREATE TEMPORARY TABLE tmptable_1 SELECT * FROM table WHERE primarykey = 1;
ALTER TABLE tmptable_1 MODIFY primarykey int(12) null;
UPDATE tmptable_1 SET primarykey = NULL;
INSERT INTO table SELECT * FROM tmptable_1;
DROP TEMPORARY TABLE IF EXISTS tmptable_1;

または、mariadb / mysqlの新しいバージョンでは、primaryKeyを0に設定して、挿入時に自動インクリメントを機能させることもできます。
シェルペペレイラ


2

Kohaデータベースで、バーコード列に接頭辞「C」が付いた重複アイテムを挿入するために使用しました。

INSERT INTO items (`biblionumber`, `biblioitemnumber`, `barcode`, `dateaccessioned` ) SELECT `biblionumber`, `biblioitemnumber`,  CONCAT('C',`barcode`), `dateaccessioned` FROM `items` WHERE barcode='14832';

1

私はこれをしなければならず、これが私の手動の解決策でした:

  1. phpmyadminの、あなたがコピーしたい行をチェックします
  2. クエリ結果の操作の下の下部にある エクスポート
  3. 次のページで[ ファイルとして保存 ]をオンにして、「ゴー」を
  4. エクスポートされたファイルをテキストエディターで開き、プライマリフィールドの値を見つけて、一意のフィールドに変更します。
  5. phpmyadminに戻り、「インポート」タブをクリックして、参照の下で.sqlファイルをインポートするファイルを見つけ、「実行」をクリックすると、重複する行が挿入されます。

PRIMARYフィールドがわからない場合は、phpmyadminページを確認し、[ 構造 ]タブをクリックします。ページの下部にある[インデックス ]の下に、どの[フィールド][キー名]があるかが表示されます。値'PRIMARY'

長い道のりのようなものですが、マークアップを処理したくない場合は、そこに単一の行を複製する必要があるだけです。


ニース、すぐに使える方法で操作に答えます。ブロブや地理空間データなど、明らかにすべてのケースで機能するわけではありませんが、非常に簡単に引き離すことができ、これらの奇妙なボールの変更でも機能します。
Strixy 2013

1

上記で示したこのソリューションは、選択した行に対しても完全に機能します。たとえば、私はnice2workプロジェクトのデモ行を作成していますが、これは完璧に機能します。

CREATE TEMPORARY TABLE tmptable SELECT * FROM myTable WHERE id=500;
UPDATE tmptable SET id = 0;
UPDATE some fields I need to change
INSERT INTO myTable SELECT * FROM tmptable;
DROP TABLE tmptable;

//  You can use this same also directly into your code like (PHP Style)
$sql = "CREATE TEMPORARY TABLE tmptable SELECT * FROM myTable WHERE id=500;
UPDATE tmptable SET id = 0;
UPDATE some fields I need to change
INSERT INTO myTable SELECT * FROM tmptable;DROP TABLE tmptable;";

0

ネクロポストに申し訳ありませんが、これは私がグーグルで調べたものであり、これは役に立ったが問題があると思ったので、これを掘る他の人に重要な変更を加えたかったです。

まず、MySQLではなくSQL Serverを使用していますが、同様に機能するはずです。私はLeonard Challisのソリューションを使用しました。これは最も簡単でニーズを満たしたためですが、これには問題があります。単にPKを取得して1だけインクリメントすると、問題の行が追加されてから他のレコードを追加した場合にどうなりますか。 。システムにPKの自動インクリメントを処理させるだけが最善であると判断したため、次のようにしました。

SELECT * INTO #tmpTable FROM Table WHERE primarykey = 1
--Optionally you can modify one or more fields here like this: 
--UPDATE #tmpTable SET somefield = newData
ALTER TABLE #tmpTable DROP COLUMN TicketUpdateID
INSERT INTO Tickets SELECT * FROM #tmpTable
DROP TABLE #tmpTable

これはMySQLでも同様に機能すると思いますが、これをテストすることはできません。


1
完全にwawaasの回答
AsadYarKhan 2013年

0

私はそれが古い質問であることを知っていますが、ここに別の解決策があります:

これにより、主キーが自動インクリメントであると想定して、メインテーブルの行が複製され、リンクテーブルデータのコピーが新しいメインテーブルIDで作成されます。

列名を取得するためのその他のオプション:
-SHOW COLUMNS FROM tablename; (列名:フィールド)
-DESCRIBE tablename (列名:フィールド)
-SELECT column_name FROM information_schema.columns WHERE table_name = 'tablename'(列名:column_name)

//First, copy main_table row
$ColumnHdr='';
$Query="SHOW COLUMNS FROM `main_table`;";
$Result=Wrappedmysql_query($Query,$link,__FILE__,__LINE__);
while($Row=mysql_fetch_array($Result))
{
    if($Row['Field']=='MainTableID')     //skip main table id in column list
        continue;
    $ColumnHdr.=",`" . $Row['Field'] . "`";
}
$Query="INSERT INTO `main_table` (" . substr($ColumnHdr,1) . ")
        (SELECT " . substr($ColumnHdr,1) . " FROM `main_table`
            WHERE `MainTableID`=" . $OldMainTableID . ");";
$Result=Wrappedmysql_query($Query,$link,__FILE__,__LINE__);
$NewMainTableID=mysql_insert_id($link);

//Change the name (assumes a 30 char field)
$Query="UPDATE `main_table` SET `Title`=CONCAT(SUBSTRING(`Title`,1,25),' Copy') WHERE `MainTableID`=" . $NewMainTableID . ";";
$Result=Wrappedmysql_query($Query,$link,__FILE__,__LINE__);

//now copy in the linked tables
$TableArr=array("main_table_link1","main_table_link2","main_table_link3");
foreach($TableArr as $TableArrK=>$TableArrV)
{
    $ColumnHdr='';
    $Query="SHOW COLUMNS FROM `" . $TableArrV . "`;";
    $Result=Wrappedmysql_query($Query,$link,__FILE__,__LINE__);
    while($Row=mysql_fetch_array($Result))
    {
        if($Row['Field']=='MainTableID')     //skip main table id in column list, re-added in query
            continue;
        if($Row['Field']=='dbID')    //skip auto-increment,primary key in linked table
            continue;
        $ColumnHdr.=",`" . $Row['Field'] . "`";
    }

    $Query="INSERT INTO `" . $TableArrV . "` (`MainTableID`," . substr($ColumnHdr,1) . ")
            (SELECT " . $NewMainTableID . "," . substr($ColumnHdr,1) . " FROM `" . $TableArrV . "`
             WHERE `MainTableID`=" . $OldMainTableID . ");";
    $Result=Wrappedmysql_query($Query,$link,__FILE__,__LINE__);
}

0

少なくともオートインクリメントの場合、max233は確かに正しい軌道にありました。ただし、ALTER TABLEは実行しないでください。一時テーブルの自動インクリメントフィールドをNULLに設定するだけです。これはエラーになりますが、一時テーブルのすべてのフィールドの次のINSERTが発生し、NULL自動フィールドが一意の値を取得します。


0

テーブルを作成する

    CREATE TABLE `sample_table` (
       `sample_id` INT(10) unsigned NOT NULL AUTO_INCREMENT,
       `sample_name` VARCHAR(255) NOT NULL,
       `sample_col_1` TINYINT(1) NOT NULL,
       `sample_col_2` TINYINT(2) NOT NULL,

      PRIMARY KEY (`sample_id`),
      UNIQUE KEY `sample_id` (`sample_id`)

    ) ENGINE='InnoDB' DEFAULT CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

行を挿入する

INSERT INTO `sample_table`
   VALUES(NULL, 'sample name', 1, 2);

上記の行挿入のクローン

INSERT INTO `sample_table`
   SELECT 
    NULL AS `sample_id`, -- new AUTO_INCREMENT PRIMARY KEY from MySQL
    'new dummy entry' AS `sample_name`,  -- new UNIQUE KEY from you
    `sample_col_1`, -- col from old row
    `sample_col_2` -- col from old row
   FROM `sample_table`
   WHERE `sample_id` = 1;

テスト

SELECT * FROM `sample_table`;

注:エラー(#1048)が発生する場合は、NULLの代わりに ''を使用してください
AbdullahAydınOct

それは私だけですか、これはまさに OPが何をしていないしたいですか?(つまり、クエリにすべての列を手動で追加します。)
Byson

そうです、私はOPの「1つの行をコピーして同じテーブルに挿入したい」という文章を読んだだけです。多分、とにかく、これは「キーの重複したエントリ 'xxx'のためにまだ役に立ちますか???」エラー^^
AbdullahAydınFeb

0

これは、このサイトでオンラインで見つけた答えです。上記の方法を説明しています1 見つけた回答です。回答はページの下部にあります。基本的には、行をコピーして、メモリに保持されている一時テーブルにコピーします。次に、更新を使用して主キー番号を変更します。次に、それをターゲットテーブルに再挿入します。次に、テーブルをドロップします。

これはそのコードです:

CREATE TEMPORARY TABLE rescueteamENGINE = MEMORY SELECT * FROM fitnessreport4WHERE rID = 1;#1行が影響を受けました。UPDATE rescueteamSET rID = Null WHERE rID = 1;#1行が影響を受けました。INSERTINTO fitnessreport4SELECT * FROM rescueteam;#1行が影響を受けました。DROP TABLE rescueteam#MySQLは空の結果セット(つまり、ゼロ
行)を返しました。

一時テーブルrescueteamを作成しました。元のテーブルfitnessreport4から行をコピーしました。次に、一時テーブルの行の主キーをnullに設定して、重複キーエラーが発生することなく、元のテーブルにコピーして戻すことができるようにします。私は昨日の夕方にこのコードを試しましたが、うまくいきました。


0

これは、「Grim ...」の回答に対する追加の解決策です。主キーがnullであるというコメントがいくつかあります。それが機能しないことについてのいくつかのコメント。そして、ソリューションに関するコメント。解決策はどれもうまくいきませんでした。InnoDBテーブルを含むMariaDBがあります。

主キーをnullを許可するように設定できませんでした。NULLの代わりに0を使用すると、主キーの重複値エラーが発生しました。 SET SQL_SAFE_UPDATES = 0;どちらもうまくいきませんでした。

「Grim ...」からの解決策は、PRIMARY KEYをUNIQUEに変更した場合に機能しました


-1

私のPHPコードを投稿したかっただけです。列を収集する方法は、前の例よりもコードが少しきれいだと思います。また、これはフィールドを簡単に変更する方法を示しています。この場合は、文字列を追加しています。ただし、いくつかの子レコードもコピーする場合は、外部キーフィールドを新しく追加したレコードで置き換えることもできます。

  // Read columns, unset the PK (always the first field in my case)
  $stmt = $conn->prepare('SHOW COLUMNS FROM template');
  $stmt->execute();

  $columns = $stmt->fetchAll();
  $columns = array_map(function ($element) { return $element['Field']; }, $columns);

  unset($columns[0]);

  // Insert record in the database. Add string COPY to the name field.
  $sql = "INSERT INTO `template` (".implode(",", $columns).")";
  if ($key = array_search('name', $columns))
      $columns[$key] = "CONCAT(name, ' COPY')";
  $sql .= " SELECT ".implode(",", $columns)." FROM `template` WHERE `id` = ".$id;

  $stmt = $conn->prepare($sql);
  $stmt->execute();

-2

非常に単純なソリューションの場合、PHPMyAdminを使用して行をCSVファイルとしてエクスポートし、修正したCSVファイルをインポートするだけで済みます。インポートする前にID / primarykey列を編集して値を表示しないようにします。

SELECT * FROM table where primarykey=1

次に、ページの下部で:

ここに画像の説明を入力してください

「Export」は、単にエクスポートしてから、csvファイルを編集してprimarykeyの値を削除し、空にしてから、データベースにインポートするだけで、インポート時に新しいプライマリキーが割り当てられます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.