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;
Есть ли более простой способ решить эту проблему?
mysql
copy
duplicates
row
Lina
источник
источник
max(oldtable.id) + oldtable_temp.key
этого, чтобы убедиться, что идентификатор увеличивается и является уникальным.Ответы:
Я использовал технику Леонарда Чаллиса с некоторыми изменениями:
В качестве временной таблицы никогда не должно быть более одной записи, поэтому вам не нужно беспокоиться о первичном ключе. Установка его в null позволяет MySQL выбирать само значение, поэтому нет риска создания дубликата.
Если вы хотите быть уверены, что вставляете только одну строку, вы можете добавить LIMIT 1 в конец строки INSERT INTO.
Обратите внимание, что я также добавил значение первичного ключа (в данном случае 1) к имени моей временной таблицы.
источник
tmptable_1
противtmptable
)primarykey
INT NULL; после первой строки, чтобы заставить решение работатьОбновление 07/07/2014 - Ответ, основанный на моем ответе Grim ... , является лучшим решением, поскольку он улучшает мое решение ниже, поэтому я бы предложил использовать его.
Вы можете сделать это, не перечисляя все столбцы со следующим синтаксисом:
Вы можете решить изменить первичный ключ другим способом.
источник
tmptable
, вам не нужно добавлятьWHERE primarykey = 2
оператор для последней строки. (Т.е. простоINSERT INTO table SELECT * FROM tmptable
.)Я предполагаю, что вы хотите, чтобы новая запись имела новую
primarykey
? Еслиprimarykey
это так,AUTO_INCREMENT
просто сделайте это:... где
col1, col2, col3, ...
все столбцы в таблице, кромеprimarykey
.Если это не
AUTO_INCREMENT
столбец, и вы хотите иметь возможность выбрать новое значение дляprimarykey
него аналогично:... где
567
новое значение дляprimarykey
.источник
Вы почти получили его с первым запросом, вам просто нужно указать столбцы. Таким образом, вы можете исключить свой первичный ключ из вставки, который применит автоматическое приращение, которое вы, вероятно, имеете в таблице, чтобы автоматически создать новый первичный ключ для запись.
Например, измените это:
К этому:
Просто не включайте столбец primarykey ни в список столбцов для INSERT, ни для SELECT-частей запроса.
источник
insert into table ("val1", col2, col3) select col2, col3 from table where primarykey = 1
или что-то подобное?Вы также можете попробовать сбросить таблицу, найти команду вставки и отредактировать ее:
Это
--skip-extended-insert
дает вам одну команду вставки на строку. Затем вы можете найти строку в вашем любимом текстовом редакторе, извлечь команду и изменить первичный ключ на «default».источник
Эта процедура предполагает, что:
Конечно, это не идеально, но в определенных (возможно, в большинстве) случаях это будет работать.
источник
works
но подход обоснован и имеет ценность, потому что здесь он уникален и действительно отвечает на вопрос ОП.Это может быть достигнуто с некоторой креативностью:
Это приведет к тому, что новая строка получит автоматически увеличенный идентификатор вместо идентификатора из выбранной строки.
источник
Если поле первичного ключа вашей таблицы является полем с автоинкрементом, то вы можете использовать запрос со столбцами. Например, ваша именованная таблица
test_tbl
имеет 3 поля какid, name, age
.id
является полем первичного ключа и автоматическим приращением, поэтому вы можете использовать следующий запрос для дублирования строки:Этот запрос приводит к дублированию каждой строки.
Если поле первичного ключа вашей таблицы не является полем с автоматическим приращением, вы можете использовать следующий метод:
Результатом этого запроса является дубликат строки,
id=19
вставленный какid=20
.источник
tableName
(fieldName1
,fieldName2
,fieldName3
) ВЫБРАТЬfieldName1
,fieldName2
,fieldName3
FROMtableName
WHERE 1 (скопировать все из них сразу)строка клона с полями обновления и значением автоинкремента
источник
Некоторые из следующего были почерпнуты из этого сайта. Вот что я сделал, чтобы дублировать запись в таблице с любым количеством полей:
Это также предполагает, что у вас есть поле ИИ в начале таблицы
источник
Я использовал технику Гримса с небольшим изменением: если кто-то ищет этот запрос, потому что не может выполнить простой запрос из-за проблемы первичного ключа:
С моей установкой MySql 5.6.26 ключ не обнуляется и выдает ошибку:
Поэтому после создания временной таблицы я изменяю первичный ключ на обнуляемый.
источник
Я мог бы опоздать в этом, но у меня есть подобное решение, которое сработало для меня.
Таким образом, мне не нужно создавать временную таблицу и т. Д. Поскольку строка копируется в ту же таблицу,
Max(PK)+1
функцию можно легко использовать.Я искал решение этого вопроса (забыл синтаксис) и закончил тем, что сделал свой собственный запрос. Забавно, как все получается несколько раз.
С уважением
источник
Если первичным ключом является автоинкремент, просто укажите каждое поле, кроме первичного ключа.
INSERT INTO table(field1,field2,field3) SELECT (field1,field2,field3) FROM table WHERE primarykey=1
источник
Я обновил решение @ LeonardChallis, так как оно не сработало для меня, как никто другой. Я удалил
WHERE
пункты иSET primaryKey = 0
во временной таблице, поэтому MySQL автоматически увеличивает значение primaryKeyЭто, конечно, дублировать все строки в таблице.
источник
Я бы использовал ниже,
источник
Я использовал в своей базе данных Koha для вставки повторяющихся элементов с префиксом 'C' в столбце штрих-кода :
источник
Я просто должен был сделать это, и это было мое ручное решение:
Если вы не знаете, что такое поле PRIMARY , посмотрите на свою страницу phpmyadmin , нажмите на вкладку «Структура» и в нижней части страницы под «Индексами» будет показано, какие поле имеет «Keyname». значение «ПЕРВИЧНОЕ» .
Это довольно долгий путь, но если вы не хотите иметь дело с разметкой и вам просто нужно дублировать один ряд, то вы идете.
источник
Это решение, показанное выше, прекрасно работает и для выбранных рядов. Например, я создаю демонстрационные ряды для своего проекта nice2work, и это прекрасно работает.
источник
Извините за некропост, но это то, что я обнаружил в Google, и так как я нашел это полезным, но проблематичным, я хотел внести важную модификацию для всех, кто копает это.
Во-первых, я использую SQL Server, а не MySQL, но я думаю, что он должен работать аналогично. Я использовал решение Леонарда Чаллиса, потому что оно было самым простым и отвечало потребностям, однако есть проблема с этим - если вы просто возьмете PK и увеличите его на 1, то что произойдет, если вы добавили другие записи после добавления рассматриваемой строки , Я решил, что лучше всего позволить системе обрабатывать автоинкремент PK, поэтому я сделал следующее:
Я считаю, что это будет работать аналогично в MySQL, но я не могу проверить это, извините
источник
Я знаю, что это старый вопрос, но вот другое решение:
Это дублирует строку в основной таблице, предполагая, что первичным ключом является автоинкремент, и создает копии данных связанных таблиц с новым идентификатором основной таблицы.
Другие варианты получения имен столбцов: -
ПОКАЗАТЬ КОЛОННЫ ИЗ
tablename
; (Имя столбца: поле)-DESCRIBE
tablename
(Имя столбца: поле)-SELECT имя- столбца FROM information_schema.columns WHERE table_name = 'tablename' (Имя столбца: column_name)
источник
max233, безусловно, был на правильном пути, по крайней мере, для случая автоинкремента. Однако не делайте ALTER TABLE. Просто установите поле автоинкремента во временной таблице в NULL. Это приведет к ошибке, но произойдет следующая INSERT для всех полей во временной таблице, и автоматическое поле NULL получит уникальное значение.
источник
Создать таблицу
Вставить строку
Вставить строку клона выше
Тест
источник
Вот ответ, который я нашел в Интернете на этом сайте Описывает, как сделать выше 1 Ответ вы можете найти в нижней части страницы. По сути, вы копируете строку, которая будет скопирована во временную таблицу, хранящуюся в памяти. Затем вы меняете номер первичного ключа, используя обновление. Затем вы снова вставляете его в целевую таблицу. Затем вы бросаете стол.
Вот код для этого:
Я создал временную таблицу rescueteam. Я скопировал строку из моей исходной таблицы fitnessreport4. Затем я устанавливаю нулевой первичный ключ для строки во временной таблице, чтобы я мог скопировать его обратно в исходную таблицу без получения ошибки Duplicate Key. Я попробовал этот код вчера вечером, и он работал.
источник
Это дополнительное решение к ответу "Grim ...". Было несколько комментариев по поводу того, что первичный ключ имеет значение null. Некоторые комментарии по этому поводу не работают. И некоторые комментарии по решениям. Ни одно из решений не сработало для нас. У нас есть MariaDB с таблицей InnoDB.
Мы не могли установить первичный ключ, чтобы позволить нуль. Использование 0 вместо NULL привело к ошибке дублированного значения для первичного ключа.
SET SQL_SAFE_UPDATES = 0;
Тоже не сработало.Решение от "Grim ..." сработало, если вместо этого мы изменили наш ПЕРВИЧНЫЙ КЛЮЧ на УНИКАЛЬНЫЙ
источник
Просто хотел опубликовать свой кусок кода PHP, потому что я думаю, что способ сбора столбцов немного чище в коде, чем в предыдущих примерах. Также это показывает, как вы можете легко изменить поле, в этом случае добавив строку. Но вы также можете заменить поле внешнего ключа на вновь добавленную запись, если вы хотите скопировать некоторые дочерние записи.
источник
Для очень простого решения вы можете использовать PHPMyAdmin для экспорта строки в виде файла CSV, а затем просто импортировать исправленный файл CSV. Редактирование столбца ID / primarykey, чтобы не показывать значения перед его импортом.
Тогда внизу страницы:
Где написано «Экспорт», просто экспортируйте, затем отредактируйте файл csv, чтобы удалить значение первичного ключа, чтобы оно было пустым, а затем просто импортируйте его в базу данных, при импорте будет назначен новый первичный ключ.
источник