MYSQL:如何在mysql中将整行从一个表复制到另一个表,第二个表有一个额外的列?

时间:2009-08-30 11:57:40

标签: mysql

除了一列之外,我有两个结构相同的表...表2中有另外一列我将插入CURRENT_DATE()

我想将table1中的所有值复制到table2。

如果我使用

INSERT INTO dues_storage SELECT * FROM dues WHERE id=5;

它会抛出错误,指出列数的差异。

我有两个问题:

  1. 我如何解决这个问题?
  2. 如何在同一语句中的table2中添加附加日期列(CURRENT_DATE())的值?

7 个答案:

答案 0 :(得分:85)

要完善Zed的答案,并回答您的评论:

INSERT INTO dues_storage
SELECT d.*, CURRENT_DATE()
FROM dues d
WHERE id = 5;

见T.J.克劳德的评论

答案 1 :(得分:48)

最安全的方法是完全指定插入和提取的列。不保证(对于应用程序)这些中的任何一个都是您认为可能的顺序。

insert into dues_storage (f1, f2, f3, cd)
    select f1, f2, f3, current_date() from dues where id = 5;

如果您担心必须更改多个执行此操作的多个PHP页面(正如您在另一个答案的注释中所示),这对于存储过程来说已经成熟。这样,所有PHP页面都只调用存储过程(例如)只复制ID,它控制实际的复制过程。这样,只有一个地方需要维护代码,在我看来,DBMS是正确的地方。

答案 2 :(得分:8)

INSERT INTO dues_storage
SELECT field1, field2, ..., fieldN, CURRENT_DATE()
FROM dues
WHERE id = 5;

答案 3 :(得分:4)

希望这会对某人有所帮助......这是我编写的一个小脚本,以防你需要复制某些列而不是其他列,和/或两个表上的列不是相同的顺序。只要列的名称相同,这将起作用。因此,如果表A具有[userid,handle,something]并且tableB具有[userID,handle,timestamp],那么你将“SELECT userID,handle,NOW()作为时间戳FROM tableA”,然后得到结果,然后将结果作为第一个参数传递给此函数($ z)。 $ toTable是要复制到的表的字符串名称,$ link_identifier是要复制到的数据库。对于小型数据集,这相对较快。不建议您尝试在生产环境中以这种方式一次移动超过几千行。我主要使用它来备份用户注销时在会话期间收集的数据,然后立即清除实时数据库中的数据以保持它的纤薄。

 function mysql_multirow_copy($z,$toTable,$link_identifier) {
            $fields = "";
            for ($i=0;$i<mysql_num_fields($z);$i++) {
                if ($i>0) {
                    $fields .= ",";
                }
                $fields .= mysql_field_name($z,$i);
            }
            $q = "INSERT INTO $toTable ($fields) VALUES";
            $c = 0;
            mysql_data_seek($z,0); //critical reset in case $z has been parsed beforehand. !
            while ($a = mysql_fetch_assoc($z)) {
                foreach ($a as $key=>$as) {
                    $a[$key] = addslashes($as);
                    next ($a);
                }
                if ($c>0) {
                    $q .= ",";
                }
                $q .= "('".implode(array_values($a),"','")."')";
                $c++;
            }
            $q .= ";";
            $z = mysql_query($q,$link_identifier);
            return ($q);
        }

答案 4 :(得分:0)

或者,您可以使用内部查询来执行此操作。

SQL> INSERT INTO <NEW_TABLE> SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM <OLD_TABLE>);

希望这有帮助!

答案 5 :(得分:0)

SET @sql = 
CONCAT( 'INSERT INTO <table_name> (', 
    (
        SELECT GROUP_CONCAT( CONCAT('`',COLUMN_NAME,'`') ) 
            FROM information_schema.columns 
            WHERE table_schema = <database_name>
                AND table_name = <table_name>
                AND column_name NOT IN ('id')
    ), ') SELECT ', 
    ( 
        SELECT GROUP_CONCAT(CONCAT('`',COLUMN_NAME,'`')) 
        FROM information_schema.columns 
        WHERE table_schema = <database_name>
            AND table_name = <table_source_name>
            AND column_name NOT IN ('id')  
    ),' from <table_source_name> WHERE <testcolumn> = <testvalue>' );  

PREPARE stmt1 FROM @sql; 
execute stmt1;

当然替换&lt;&gt;具有实际值的值,并观察您的报价。

答案 6 :(得分:-2)

只是想添加一个对我来说很漂亮的小片段。

INSERT INTO your_target_table 选择 * 来自your_rescource_table WHERE id = 18;

虽然我正在向Sequel Pro致敬,如果您不使用它,我强烈建议您下载它...让生活变得更加轻松