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

use*_*242 71 mysql

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

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

如果我使用

INSERT INTO dues_storage SELECT * FROM dues WHERE id=5;
Run Code Online (Sandbox Code Playgroud)

它会抛出一个错误,指出列数的差异.

我有两个问题:

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

cru*_*dog 89

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

INSERT INTO dues_storage
SELECT d.*, CURRENT_DATE()
FROM dues d
WHERE id = 5;
Run Code Online (Sandbox Code Playgroud)

请参阅TJ Crowder的评论

  • 非常小心**这样做.它确实有效,但它假设两个表中列的顺序相同; 它确实**不匹配列名,并试图强制值适合,这可能会导致意外的结果.现在,如果您的开发结构确保列顺序与最后一列相同,那么这是一种方便而直接的方法,但需要注意的是这一点很重要. (45认同)
  • 你甚至需要 CURRENT_DATE() 吗?您可以将该字段的类型设置为 TimeStamp,并将默认值设置为 CURRENT_TIMESTAMP。它应该将当前 DateTime 填充到创建记录的时间。 (4认同)

pax*_*blo 51

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

insert into dues_storage (f1, f2, f3, cd)
    select f1, f2, f3, current_date() from dues where id = 5;
Run Code Online (Sandbox Code Playgroud)

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


Zed*_*Zed 8

INSERT INTO dues_storage
SELECT field1, field2, ..., fieldN, CURRENT_DATE()
FROM dues
WHERE id = 5;
Run Code Online (Sandbox Code Playgroud)


小智 6

希望这会对某人有所帮助...这是我编写的一个小 PHP 脚本,以防您需要复制某些列而不是其他列,和/或两个表上的列顺序不同。只要列的名称相同,就可以了。因此,如果表 A 具有 [userid、handle、something],而 tableB 具有 [userID、handle、timestamp],那么您可以“从 tableA 中选择 userID、句柄、NOW() 作为时间戳”,然后获取结果,然后将结果作为第一个参数传递给该函数 ($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);
        }
Run Code Online (Sandbox Code Playgroud)