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

我有两个结构相同的表,只有一个列... ... 表2有一个额外的列,我将在其中插入 CURRENT _ DATE ()

我想将表1中的所有值复制到表2中。

如果我用

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

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

我有两个问题:

  1. 我该怎么办?
  2. 如何在同一语句中为表2中的附加日期列(CURRENT _ DATE ())添加值?
139219 次浏览
INSERT INTO dues_storage
SELECT field1, field2, ..., fieldN, CURRENT_DATE()
FROM dues
WHERE id = 5;

来完善 Zed 的回答,并回答你的评论:

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

看看 T.J. Crowder 的评论

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

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

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

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

 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);
}

只是想添加这个小片段,这对我来说非常好用。

INSERT INTO your _ target _ table 选择 * 来自您的 _ resource _ table 其中 id = 18;

虽然我在这里大声呼吁续集专业,如果你不使用它,我强烈建议下载它... 使生活更容易

或者,您也可以使用内部查询来这样做。

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

希望这个能帮上忙!

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;

当然,用实际值替换 < > 值,并注意引号。