В MySQL я могу скопировать одну строку, чтобы вставить в ту же таблицу? - PullRequest
143 голосов
/ 28 октября 2010
insert into table select * from table where primarykey=1

Я просто хочу скопировать одну строку для вставки в ту же таблицу (т. Е. Я хочу дублировать существующую строку в таблице), но я хочу сделать это без необходимости перечислять все столбцы после «select», потому что в этой таблице слишком много столбцов.

Но когда я делаю это, я получаю ошибку:

Дублирующаяся запись 'xxx' для ключа 1

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

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;

Есть ли более простой способ решить эту проблему?

Ответы [ 25 ]

2 голосов
/ 11 февраля 2014

Я могу опоздать, но у меня есть похожее решение, которое сработало для меня.

 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 голосов
/ 19 марта 2014

Если первичным ключом является автоинкремент, просто укажите каждое поле, кроме первичного ключа.

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

2 голосов
/ 08 апреля 2014

Я обновил решение @ 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 голосов
/ 15 сентября 2016

Я бы использовал ниже,

insert into ORDER_ITEM select * from ORDER_ITEM where ITEM_NUMBER =123;
1 голос
/ 12 июня 2019

Я использовал в своей базе данных Коха для вставки повторяющихся элементов с префиксом 'C' в столбец штрих-код :

INSERT INTO items (`biblionumber`, `biblioitemnumber`, `barcode`, `dateaccessioned` ) SELECT `biblionumber`, `biblioitemnumber`,  CONCAT('C',`barcode`), `dateaccessioned` FROM `items` WHERE barcode='14832';
1 голос
/ 06 февраля 2013

Мне просто нужно было сделать это, и это было мое ручное решение:

  1. В phpmyadmin , проверьте строку, которую вы хотите скопировать
  2. Внизув операциях с результатами запроса нажмите «Экспорт»
  3. На следующей странице отметьте «Сохранить как файл» , затем нажмите «Перейти»
  4. Откройте экспортированный файл в текстовом редакторе, найдите значение основного поля и измените его на что-то уникальное.
  5. Вернитесь к phpmyadmin нажмите 'Импорт'На вкладке найдите файл для импорта .sql в browse , нажмите 'Go' , и необходимо вставить дублирующую строку.

ЕслиВы не знаете, что такое поле PRIMARY , посмотрите на свою страницу phpmyadmin , нажмите вкладку 'Structure' и внизу страницыпод 'Indexes' будет показано, какое 'Field' имеет 'Keyname' значение 'PRIMARY' .

Вид долгого путираунд, но если вы не хотите иметь дело с разметкой и вам просто нужно дублировать одну строку, то вы идете.

1 голос
/ 11 января 2017

Это решение, показанное выше, прекрасно работает и для выбранных рядов.Например, я создаю демонстрационные ряды для своего проекта 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;";
1 голос
/ 18 августа 2015

Я использовал технику Гримса с небольшим изменением: если кто-то ищет этот запрос, потому что не может выполнить простой запрос из-за проблемы с первичным ключом:

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

При установке MySql 5.6.26 ключ не обнуляется и выдает ошибку:

#1048 - Column 'primakey' cannot be 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;
0 голосов
/ 02 мая 2013

Извините за некропост, но это то, что я обнаружил в Google, и так как я нашел это полезным, но проблематичным, я хотел внести важную модификацию для всех, кто копает это.

Во-первых, я использую SQL Server, а не MySQL, но я думаю, что он должен работать аналогично. Я использовал решение Леонарда Чаллиса, потому что оно было самым простым и отвечало потребностям, однако есть проблема с этим - если вы просто возьмете 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, но я не могу это проверить, извините

0 голосов
/ 22 июня 2016

Для очень простого решения вы можете использовать PHPMyAdmin для экспорта строки в виде файла CSV, а затем просто импортировать исправленный файл CSV.Редактирование столбца идентификатора / первичного ключа для отображения значения до его импорта.

SELECT * FROM table where primarykey=1

Затем в нижней части страницы:

enter image description here

Где написано «Экспорт», просто экспортируйте, затем отредактируйте файл csv, чтобы удалить значение первичного ключа, чтобы оно было пустым, а затем просто импортируйте его в базу данных, при импорте будет назначен новый первичный ключ.

...