Mysql Clone Row с первичным ключом - PullRequest
4 голосов
/ 18 января 2010

У меня есть таблица Mysql с одним первичным ключом (называемым pkey), который автоматически увеличивается, и я хотел бы клонировать одну строку, сохраняя все данные одинаковыми, за исключением первичного ключа, который должен стать следующим доступным значением, как определяется автоматическим приращением.

Мой первый вопрос: возможен ли следующий запрос?

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

, если пытались

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

Но он только устанавливает значение первичного ключа на ноль. Заранее благодарю за любую помощь / предложения.

UPDATE:

Полагаю, мне следует добавить, что я на самом деле не хочу две копии данных в таблице. Я просто хочу изменить первичный ключ. Поэтому, если бы я использовал INSERT SELECT, мне пришлось бы компенсировать это, используя ON DUPLICATE KEY UPDATE pkey = 'next_available_primary_key', я просто не уверен, как это сделать ...

Ответы [ 5 ]

7 голосов
/ 18 января 2010

Вы хотите вставить, а не ОБНОВИТЬ, если вы пытаетесь создать новую строку в таблице.

Как насчет этого? Убедитесь, что ваш PKEY настроен на автоинкремент.

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'
3 голосов
/ 18 января 2010
insert into t select 0,a,b,c,d,e from t where id = some_id

используйте 0 в качестве значения для столбца auto_increment, mysql будет использовать следующий доступный ...

отредактировано для вашего нового комментария, если вы хотите изменить идентификатор на следующий доступный,

update tbl set id = (select auto_increment from
  information_schema.tables where  table_name = 'tbl') where id = 4;
2 голосов
/ 24 января 2012

Как насчет решения, найденного на 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;

, где

  • % 1 равно "T" + raw_time_stamp, ex T20120124132754
  • % 2 - oldid
  • % 3 нова
0 голосов
/ 01 марта 2017

Обратите внимание, что другие приведенные решения, похоже, работают с исходной таблицей, которая допускает значение NULL для столбца первичного ключа. Поскольку это не так для меня, я столкнулся с ошибкой, которую можно легко исправить, изменив временную таблицу (я ожидал, что id будет первичным ключом):

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();
0 голосов
/ 26 декабря 2016

Клонировать записи таблицы с автоинкрементным первичным ключом

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`;
...