【问题标题】:Clone MySQL Row plus new unique ID克隆 MySQL 行加上新的唯一 ID
【发布时间】:2012-04-11 01:08:03
【问题描述】:

我可以使用以下代码在我的表中克隆一行:

$uuid = 'blahblah';    
INSERT INTO events (title, subtitle) SELECT title, subtitle FROM events WHERE uuid = '$uuid'

但是,我想为新克隆的行生成一个新的唯一 ID。此表列的名称为“uuid”,如何在克隆过程中插入新的唯一 ID?我有一个 INT 类型的自动索引列,但我也有一个 VARCHAR 类型的唯一 ID 列,用于每一行(混合字母数字)。

提前致谢。

【问题讨论】:

  • $uuid = 'blahblah'; 看起来不像 MySQL。如果您使用的是 PHP,则此插入查询很可能会发生 SQL 注入。

标签: mysql clone


【解决方案1】:

我在这里找到了答案 - PHP MySQL Copy a row within the same table... with a Primary and Unique key

基本上,选择除 ID 之外的所有内容,只要主键设置为自动递增 - 应该没问题。

【讨论】:

  • 您的问题与 PHP 无关,标签中的 PHP 也不是。仅使用 MySQL 的解决方案怎么样?那里提供的答案很明显,还需要 2 个查询:选择然后插入,仅使用准备好的语句就大约 10 行。
  • @undefined 你显然只看了这个链接的标题。如果您确实这样做了,您会看到公认的解决方案是 MySQL 解决方案。
【解决方案2】:
/*
eduardoaf.com
https://github.com/eacevedof/
*/
DELIMITER $$

DROP PROCEDURE IF EXISTS `prc_clone_row`$$

CREATE PROCEDURE `prc_clone_row`(
    sTableName VARCHAR(25)
    ,sId VARCHAR(5)
    )
BEGIN
    SET @sSQL := CONCAT('SELECT (MAX(id)+1) AS idnew FROM ',sTableName,' INTO @sIdNew');
    PREPARE sExecute FROM @sSQL;
    EXECUTE sExecute;

    IF (@sIdNew IS NOT NULL) THEN
        SET @sSQL := CONCAT('CREATE TEMPORARY TABLE tempo_table SELECT * FROM ',sTableName,' WHERE id = ',sId,'; ');
        PREPARE sExecute FROM @sSQL;
        EXECUTE sExecute; 

        SET @sSQL := CONCAT('UPDATE tempo_table SET id=',@sIdNew,' WHERE id=',sId,'; ');
        PREPARE sExecute FROM @sSQL;
        EXECUTE sExecute;        

        SET @sSQL := CONCAT('INSERT INTO ',sTableName,' SELECT * FROM tempo_table WHERE id=',@sIdNew,'; ');
        PREPARE sExecute FROM @sSQL;
        EXECUTE sExecute; 

        SET @sSQL := CONCAT('SELECT * FROM ',sTableName,' ORDER BY id DESC;');
        PREPARE sExecute FROM @sSQL;
        EXECUTE sExecute;   
    ELSE
        SELECT CONCAT('TABLE ',sTableName,' IS EMPTY!!!') AS msg;
    END IF;

END$$

DELIMITER ;

CALL prc_clone_row('app_cms_content','1');

【讨论】:

  • 除了代码,您的答案可能应该包含一些解释(?)...
  • 很好的解决方案,这就是问题所在。相反,接受的答案需要 PHP。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
相关资源
最近更新 更多