Подтвердить что ты не робот

Копировать строку, но с новым идентификатором

У меня есть таблица "test" с автоматически увеличивающимся id и произвольным числом столбцов.

Я хочу сделать копию строки в этой таблице со всеми столбцами, за исключением, конечно, id.

Есть ли способ сделать это, не назвав все столбцы?

Я думал, что INSERT... SELECT... ON DUPLICATE KEY поможет мне, пока я не пойму, что он никогда не делает INSERT ON DUPLICATE, он просто обновляет существующую строку.

4b9b3361

Ответ 1

Скажем, ваша таблица имеет следующие поля:

( pk_id int not null auto_increment primary key,
  col1 int,
  col2 varchar(10)
)

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

insert into my_table( col1, col2 ) select col1, col2 from my_table where pk_id=?;

Это создаст новое значение для поля pk_id и скопирует значения из col1 и col2 выбранной строки.

Вы можете расширить этот образец, чтобы применить к нему дополнительные поля.

UPDATE:
В связи с комментариями от JohnP и Martin -

Мы можем использовать временную таблицу для буферизации сначала из основной таблицы и использовать ее для копирования в основную таблицу. Простое обновление поля ссылок pk в таблице temp не поможет, поскольку оно может уже присутствовать в основной таблице. Вместо этого мы можем отбросить pk-поле из таблицы temp и скопировать все остальные в основную таблицу.

В отношении ответа Тима Рюхсена в ссылка:

CREATE TEMPORARY TABLE tmp SELECT * from my_table WHERE ...;
ALTER TABLE tmp drop pk_id; # drop autoincrement field
# UPDATE tmp SET ...; # just needed to change other unique keys
INSERT INTO my_table SELECT 0,tmp.* FROM tmp;
DROP TEMPORARY TABLE tmp;

Надеюсь, что это поможет.

Ответ 2

Это работает в MySQL всех версий и Amazon RDS Aurora:

INSERT INTO my_table SELECT 0,tmp.* FROM tmp;

или

Установка столбца индекса в NULL, а затем выполнение INSERT.

Но не в MariaDB, я тестировал версию 10.

Ответ 3

НАСТОЯЩИЕ РАБОТЫ ДЛЯ ТОГО, ЧТОБЫ ТОЛЬКО ТОЛЬКО ДЛЯ ТОГО

  • Выберите свою одну строку из таблицы
  • Получить все ассоциативные
  • удалить строку ID (уникальный индексный ключ)
  • Импортировать массивы [0] в имена столбцов
  • Импортировать значения массива [0] в значения столбца
  • Запустить запрос

Код:

 $qrystr = "SELECT * FROM mytablename  WHERE id= " . $rowid;
 $qryresult = $this->connection->query($qrystr);
 $result = $qryresult->fetchAll(PDO::FETCH_ASSOC);
 unset($result[0]['id']); //Remove ID from array
 $qrystr = " INSERT INTO mytablename";
 $qrystr .= " ( " .implode(", ",array_keys($result[0])).") ";
 $qrystr .= " VALUES ('".implode("', '",array_values($result[0])). "')";
 $result = $this->connection->query($qrystr);
 return $result;

Конечно, вы должны использовать PDO: bindparam и проверять свои переменные на атаку и т.д. но дает пример

дополнительная информация

Если у вас возникла проблема с обработкой значений NULL, вы можете использовать следующие коды, чтобы imploding имена и значения, для которых значение не было NULL.

foreach ($result[0] as $index => $value) {
    if ($value === null) unset($result[0][$index]);
}

Ответ 4

в зависимости от количества столбцов, вы можете просто назвать столбцы, без идентификатора и вручную добавить идентификатор или, если он есть в вашей таблице, вторичный идентификатор (sid):

insert into PROG(date, level, Percent, sid) select date, level, Percent, 55 from PROG where sid = 31 Здесь, если sid 31 имеет более одной результирующей строки, все они будут скопированы в sid 55 и ваш Автоматические идентификаторы все равно будут генерироваться автоматически. только для идентификатора: insert into PROG(date, level, Percent, ID) select date, level, Percent, 55 from PROG where ID = 31 где 55 - следующий доступный идентификатор в таблице, а идентификатор 31 - тот, который вы хотите скопировать,

Ответ 5

INSERT into table_name (  
    `product_id`, 
    `other_products_url_id`, 
    `brand`, 
    `title`, 
    `price`, 
    `category`, 
    `sub_category`, 
    `quantity`, 
    `buy_now`, 
    `buy_now_url`, 
    `is_available`, 
    `description`, 
    `image_url`, 
    `image_type`, 
    `server_image_url`, 
    `reviews`, 
    `hits`, 
    `rating`, 
    `seller_name`, 
    `seller_desc`, 
    `created_on`, 
    `modified_on`, 
    `status`) 
SELECT 
    `product_id`, 
    `other_products_url_id`, 
    `brand`, 
    `title`, 
    `price`, 
    `category`, 
    `sub_category`, 
    `quantity`, 
    `buy_now`, 
    concat(`buy_now_url`,'','#test123456'), 
    `is_available`, 
    `description`, 
    `image_url`, 
    `image_type`, 
    `server_image_url`, 
    `reviews`, 
    `hits`, 
    `rating`, 
    `seller_name`, 
    `seller_desc`, 
    `created_on`, 
    `modified_on`, 
    `status` 
FROM `table_name` WHERE id='YourRowID';