Mysql:复制行,但与新的ID
我有一个表“testing”与自动递增的id
和任意数量的列。
我想在这个表中创build一个行的副本,所有的列除了id
之外都是一样的。
有没有办法做到这一点,而不命名所有列?
我认为INSERT... SELECT... ON DUPLICATE KEY
会帮助我,直到我意识到它从不进行INSERT ON DUPLICATE
,它只是更新现有的行。
让我们说你的桌子有以下领域:
( 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在提到的文章中的回答:
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;
希望这可以帮助。
这工作仅用于复制一行
- 从你的表中select你的一行
- 取所有关联
- 取消设置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并检查您的variables是否受到攻击等,但举例说明
附加信息
如果您在处理NULL
值时遇到问题,则可以使用以下代码,以便仅为其值不为NULL
imploding
名称和值生成内部代码。
foreach ($result[0] as $index => $value) { if ($value === null) unset($result[0][$index]); }
这适用于MySQL所有版本和Amazon RDS Aurora:
INSERT INTO my_table SELECT 0,tmp.* FROM tmp;
要么
将索引列设置为NULL,然后执行INSERT。
但是在MariaDB中,我testing了版本10。
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';