mysql 复制行,但使用新ID

mm9b1k5b  于 2022-12-26  发布在  Mysql
关注(0)|答案(7)|浏览(163)

我有一个表“test”,它具有自动递增的id和任意数量的列。
我想复制该表中的一行,当然除了id之外,所有列都相同。
有没有办法做到这一点,而不命名所有列?
我以为INSERT... SELECT... ON DUPLICATE KEY会对我有所帮助,直到我意识到它从来不生成INSERT ON DUPLICATE,它只是更新现有的行。

u0sqgete

u0sqgete1#

假设您的表具有以下字段:

( 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字段,并将所有其他字段复制到主表中。
参考referred postingTim Ruehsen的回答:

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;
falq053o

falq053o2#

这适用于MySQL所有版本和Amazon RDS Aurora:

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


将索引列设置为NULL,然后执行INSERT。
但不是在MariaDB中,我测试了版本10。

r7xajy2e

r7xajy2e3#

这仅适用于复制一行

  • 从表中选择一行
  • 获取所有关联
  • 取消设置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值时遇到问题,可以使用以下代码,以便仅针对其值不是NULLimploding名称和值。

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

wn9m85ua4#

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;
ncecgwcz

ncecgwcz5#

根据列的数量,您可以只命名列,而不添加ID,然后手动添加一个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,并且您的auto iD仍将自动生成。insert into PROG(date, level, Percent, ID) select date, level, Percent, 55 from PROG where ID = 31,其中55是表中的下一个可用ID,ID 31是要复制的ID。

xam8gpfp

xam8gpfp6#

我正在使用临时表:

CREATE TEMPORARY TABLE tmp SELECT * FROM sitelog WHERE 1=1;
ALTER TABLE tmp DROP COLUMN `ID`;
INSERT INTO sitelog SELECT 0, tmp.* FROM tmp;
DROP TEMPORARY TABLE tmp;
0s0u357o

0s0u357o7#

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

相关问题