Копировать строку, но с новым идентификатором
У меня есть таблица "test" с автоматически увеличивающимся id
и произвольным числом столбцов.
Я хочу сделать копию строки в этой таблице со всеми столбцами, за исключением, конечно, id
.
Есть ли способ сделать это, не назвав все столбцы?
Я думал, что INSERT... SELECT... ON DUPLICATE KEY
поможет мне, пока я не пойму, что он никогда не делает INSERT ON DUPLICATE
, он просто обновляет существующую строку.
Ответы
Ответ 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';