MYSQL:如何复制整个行从一个表到另一个在MySQL与第二个表有一个额外的列?
我有两个具有相同的结构,除了一列之外的表…表2有额外的列,我将插入CURRENT_DATE()
我想复制table1中的所有值到table2。
如果我使用
INSERT INTO dues_storage SELECT * FROM dues WHERE id=5;
它会抛出一个错误指出列数的差异。
我有两个问题:
- 我如何解决这个问题?
- 以及如何添加table2中的附加date列(CURRENT_DATE())在这个相同的语句中的值?
为了完善Zed的答案,并回答你的评论:
INSERT INTO dues_storage SELECT d.*, CURRENT_DATE() FROM dues d WHERE id = 5;
见TJ Crowder的评论
最安全的方法是完全指定插入和提取的列。 (对于应用程序)没有任何保证,这些将是您认为可能的顺序。
insert into dues_storage (f1, f2, f3, cd) select f1, f2, f3, current_date() from dues where id = 5;
如果您担心需要更改多个PHP页面(如您在其他答案的注释中指出的那样),则存储过程已经成熟。 这样,所有的PHP页面都可以简单地调用存储过程(例如)仅复制该ID,并控制实际的复制过程。 这样,只有一个地方需要维护代码,并且在我看来,DBMS是正确的地方。
INSERT INTO dues_storage SELECT field1, field2, ..., fieldN, CURRENT_DATE() FROM dues WHERE id = 5;
希望这将有助于某人…这是我写的一个小小的PHP脚本,以防您需要复制某些列而不是其他列,和/或列在两个表上的顺序不同。 只要列名称相同,这将工作。 所以如果表A有[userid,handle,something]和tableB有[userID,handle,timestamp],那么你将“selectuserID,处理NOW()作为时间戳FROM tableA”,然后得到结果,将结果作为第一个parameter passing给此函数($ z)。 $ toTable是要复制到的表的string名称,$ link_identifier是要复制到的数据库。 对于小数据集这是相对较快的。 没有build议您尝试在生产环境中一次移动超过几千行。 我主要用它来备份会话期间用户注销时收集的数据,然后立即清除活动数据库中的数据,以保持它的苗条。
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); }
或者,您可以使用内部查询来执行此操作。
SQL> INSERT INTO <NEW_TABLE> SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM <OLD_TABLE>);
希望这可以帮助!
只是想添加这个为我精美的小片段。
INSERT INTO your_target_table SELECT * FROM your_rescource_table WHERE id = 18;
而当我在这里给Sequel Pro一个大喊,如果你不使用它,我强烈build议下载它…使生活更容易
我试着你说的,但是我得到一个消息,说where子句有问题
这是我试过的:
INSERT INTO `seller` SELECT FROM `seller_test` WHERE `s_code`=11;
错误:
> #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use > near 'FROM `seller` WHERE `s_code`=11' at line 1
但是当我在SELECT关键字后添加*时,查询变成这样:
INSERT INTO `seller` SELECT ***** FROM `seller_test` WHERE `s_code`=11;
我得到一个很好的结果,所以尝试添加*关键字后的SELECT