代码之家  ›  专栏  ›  技术社区  ›  Christopher

在MySQL中复制行

  •  14
  • Christopher  · 技术社区  · 17 年前

    http://dev.mysql.com/doc/refman/5.1/en/insert-select.html 但我认为没有办法忽略一个专栏。

    在我的示例中,我试图将一行中的所有列复制到新行,主键除外。

    有没有一种方法可以做到这一点,而不必使用其中的每个字段编写查询?

    7 回复  |  直到 13 年前
        1
  •  16
  •   kontur    14 年前

    如果你的 id 或主键列是 auto_increment

    CREATE TEMPORARY TABLE temp_table 
    AS 
    SELECT * FROM source_table WHERE id='7'; 
    UPDATE temp_table SET id='100' WHERE id='7';
    INSERT INTO source_table SELECT * FROM temp_table;
    DROP TEMPORARY TABLE temp_table;
    

    这样,您就可以复制行id='7'中的所有数据,然后分配 新值“100”(或任何高于源表中当前自动增量值范围的值)。

    编辑:注意;在陈述之后:)

        2
  •  3
  •   Josh Bush    17 年前

    如果没有全部选择,则需要列出要选择的列。复制/粘贴是你的朋友。

        3
  •  2
  •   Casey    15 年前

    $sql = "SELECT * FROM table_name LIMIT 1"; 
    $res = mysql_query($sql) or die(mysql_error());
    for ($i = 1; $i < mysql_num_fields($res); $i++) {
         $col_names .= mysql_field_name($res, $i).", ";
     }
     $col_names = substr($col_names, 0, -2);
    
    $sql = "INSERT INTO table_name (".$col_names.") SELECT ".$col_names." FROM table_name WHERE condition ";
    $res = mysql_query($sql) or die(mysql_error());
    
        4
  •  1
  •   Kent Boogaart    17 年前

    如果不指定列,则必须保持条目的顺序。例如:

    INSERT INTO `users` (`ID`, `Email`, `UserName`) VALUES
    (1, 'so@so.com', 'StackOverflow')
    

    INSERT INTO `users` VALUES
    ('so@so.com', 'StackOverflow')
    

    会将电子邮件放在ID列中,因此不好。

    尝试编写一次列,如下所示:

    INSERT INTO `users` (`Email`, `UserName`) VALUES
    ('so@so.com', 'StackOverflow'),
    ('so2@so.com', 'StackOverflow2'),
    ('so3@so.com', 'StackOverflow3'),
    etc...
    

        5
  •  1
  •   Mischa Kroon    17 年前

    不,这是不可能的。

    但是很容易得到列列表,只需删除您不想复制的列。这个过程也可以通过代码等来完成。

        6
  •  1
  •   Jamie Williamson    14 年前

        7
  •  0
  •   Dipin    17 年前

    我假设,既然您想省略主键,那么它是一个 auto_increment

    考虑到这一点,假设您不需要通过insert into进行批量插入。。。从方法中选择,以下内容适用于单记录/多记录插入:

    插入mytable(null,'a','b','c');

    auto_incremented 主键和其他列是表中的其他列。当MySQL看到 自动递增 this link 更多信息)。可以通过禁用 NO_AUTO_VALUE_ON_ZERO 该链接中描述的sql模式。

    -迪平