我有一个表“test”,自动递增id
和任意数量的列。
我想在此表中复制一行,除了id
之外,所有列都相同。
有没有办法在不命名所有列的情况下执行此操作?
我认为INSERT... SELECT... ON DUPLICATE KEY
会帮助我,直到我意识到它永远不会产生INSERT ON DUPLICATE
,它只会更新现有的行。
答案 0 :(得分:92)
我们假设您的表格包含以下字段:
( 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
复制值。
您可以扩展此示例以申请表格中的更多字段。
<强>更新强>:
适当尊重JohnP和Martin的评论 -
我们可以使用临时表首先从主表缓冲,然后再用它复制到主表。 仅更新临时表中的pk参考字段将无济于事,因为它可能已存在于主表中。相反,我们可以从临时表中删除pk字段,并将所有其他字段复制到主表。
参考Tim Ruehsen中的referred posting答案:
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;
希望这有帮助。
答案 1 :(得分:4)
This works in MySQL all versions and Amazon RDS Aurora:
INSERT INTO my_table SELECT 0,tmp.* FROM tmp;
or
Setting the index column to NULL and then doing the INSERT.
But not in MariaDB, I tested version 10.
答案 2 :(得分:1)
代码:
$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]);
}
答案 3 :(得分:1)
SET @table = 'the_table';
SELECT GROUP_CONCAT(IF(COLUMN_NAME IN ('id'), 0, CONCAT("\`", COLUMN_NAME, "\`"))) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = @table INTO @columns;
SET @s = CONCAT('INSERT INTO ', @table, ' SELECT ', @columns,' FROM ', @table, ' WHERE id=1');
PREPARE stmt FROM @s;
EXECUTE stmt;
答案 4 :(得分:0)
根据存在的列数,您可以仅命名列,不使用ID,然后手动添加ID,或者在表中添加辅助ID(sid):
insert into PROG(date, level, Percent, sid) select date, level, Percent, 55 from PROG where sid = 31
在这里,如果sid 31具有多个结果行,则所有这些行都将被复制到sid 55,并且您的自动iD仍将自动生成。
仅针对ID:
insert into PROG(date, level, Percent, ID) select date, level, Percent, 55 from PROG where ID = 31
其中55是表中的下一个可用ID,而ID 31是您要复制的ID。
答案 5 :(得分:-1)
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';