复制行但使用新ID

时间:2012-07-04 15:03:35

标签: mysql

我有一个表“test”,自动递增id和任意数量的列。

我想在此表中复制一行,除了id之外,所有列都相同。

有没有办法在不命名所有列的情况下执行此操作?

我认为INSERT... SELECT... ON DUPLICATE KEY会帮助我,直到我意识到它永远不会产生INSERT ON DUPLICATE,它只会更新现有的行。

6 个答案:

答案 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字段生成新值,并从所选行的col1col2复制值。

您可以扩展此示例以申请表格中的更多字段。

<强>更新
适当尊重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)

这项工作仅用于重复一行

  • 从表中选择一行
  • 获取所有关联
  • 取消设置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]);
}

答案 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';