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 中将整行从一个表复制到另一个表,而第二个表有一个额外的列?的主要内容,如果未能解决你的问题,请参考以下文章
notepad宏的使用,定制各种操作,比如删除一整行从当前位置到行末用某字符替换