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

Posted

技术标签:

【中文标题】MYSQL:如何在 mysql 中将整行从一个表复制到另一个表,而第二个表有一个额外的列?【英文标题】:MYSQL: How to copy an entire row from one table to another in mysql with the second table having one extra column? 【发布时间】:2010-11-24 03:14:06 【问题描述】:

我有两个结构相同的表,除了一个列...表 2 有一个附加列,我将在其中插入 CURRENT_DATE()

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

如果我使用

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

它抛出一个指向列数差异的错误。

我有两个问题:

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

【问题讨论】:

你可以看看这个。它在mysql中对我有用。 ***.com/questions/57168/… 【参考方案1】:
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;

当然用实际值替换 值,并注意你的报价。

【讨论】:

【参考方案2】:

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

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

希望这会有所帮助!

【讨论】:

【参考方案3】:

只是想添加这个对我来说非常有用的小 sn-p。

插入到 your_target_table 选择 * FROM your_resource_table 哪里 id = 18;

虽然我正在使用它,但我要大力宣传 Sequel Pro,如果您不使用它,我强烈建议您下载它...让生活变得更加轻松

【讨论】:

【参考方案4】:

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

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

见 T.J.克劳德的评论

【讨论】:

非常小心这样做。它确实有效,但它假定两个表中列的顺序是相同的;它确实按列名匹配,并尝试强制值以适应,这可能会导致意外结果。现在,如果您的开发结构确保列顺序与最后一列相同,这是一种方便直接的方法,但需要注意的是。 幸运的是顺序是一样的。请记住,即使在将来也要保持结构相同。谢谢大家! @crunchdog 如果我需要像A.id = B.id 一样设置where,应该如何组织查询? 你还需要CURRENT_DATE()吗?您可以将该字段的类型设置为 TimeStamp,并将默认设置为 CURRENT_TIMESTAMP。它应该将当前的 DateTime 填充到创建记录的时间。【参考方案5】:

希望这对某人有所帮助...这是我编写的一个小 php 脚本,以防您需要复制某些列而不是其他列,和/或两个表上的列顺序不同。只要列的名称相同,这将起作用。因此,如果表 A 具有 [userid, handle, something] 而表 B 具有 [userID, handle, timestamp],那么您将“SELECT userID, handle, NOW() as timestamp 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);
        

【讨论】:

【参考方案6】:

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

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

如果您担心必须更改许多执行此操作的 PHP 页面(正如您在另一个答案的评论中所指出的那样),那么存储过程已经成熟。这样,您的所有 PHP 页面只需调用存储过程(例如)仅使用要复制的 ID,它控制实际的复制过程。这样一来,您只需要在一个地方维护代码,而且在我看来,DBMS 是正确的地方。

【讨论】:

是的.. 但我才刚刚开始。我现在必须找出存储过程是什么,谢谢!今天还要学习一件事! 这是最好的答案 对于一些额外的工作,此解决方案提供了终极保护。从一开始你就不会后悔这样做。【参考方案7】:
INSERT INTO dues_storage
SELECT field1, field2, ..., fieldN, CURRENT_DATE()
FROM dues
WHERE id = 5;

【讨论】:

表中有这么多字段,有没有更短的方法?如果我在那里更改表结构,我将不得不记住更改 php 页面。 你可以用会费来逃避它。*

以上是关于MYSQL:如何在 mysql 中将整行从一个表复制到另一个表,而第二个表有一个额外的列?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle PL/SQL:将整行从触发器转发到过程

将整行从一张excel表复制到另一张表的下一个空行

notepad宏的使用,定制各种操作,比如删除一整行从当前位置到行末用某字符替换

在 Eclipse 中将换行从 CRLF 更改为 LF

通过逐行从数据库中获取数据,使用 PHP/MySQL 生成 QR 码

MySql Delete NOT IN - 但比较整行