除了一列之外,我有两个结构相同的表...表2中有另外一列我将插入CURRENT_DATE()
我想将table1中的所有值复制到table2。
如果我使用
INSERT INTO dues_storage SELECT * FROM dues WHERE id=5;
它会抛出错误,指出列数的差异。
我有两个问题:
答案 0 :(得分:85)
要完善Zed的答案,并回答您的评论:
INSERT INTO dues_storage
SELECT d.*, CURRENT_DATE()
FROM dues d
WHERE id = 5;
见T.J.克劳德的评论
答案 1 :(得分:48)
最安全的方法是完全指定插入和提取的列。不保证(对于应用程序)这些中的任何一个都是您认为可能的顺序。
insert into dues_storage (f1, f2, f3, cd)
select f1, f2, f3, current_date() from dues where id = 5;
如果您担心必须更改多个执行此操作的多个PHP页面(正如您在另一个答案的注释中所示),这对于存储过程来说已经成熟。这样,所有PHP页面都只调用存储过程(例如)只复制ID,它控制实际的复制过程。这样,只有一个地方需要维护代码,在我看来,DBMS是正确的地方。
答案 2 :(得分:8)
INSERT INTO dues_storage
SELECT field1, field2, ..., fieldN, CURRENT_DATE()
FROM dues
WHERE id = 5;
答案 3 :(得分:4)
希望这会对某人有所帮助......这是我编写的一个小脚本,以防你需要复制某些列而不是其他列,和/或两个表上的列不是相同的顺序。只要列的名称相同,这将起作用。因此,如果表A具有[userid,handle,something]并且tableB具有[userID,handle,timestamp],那么你将“SELECT userID,handle,NOW()作为时间戳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);
}
答案 4 :(得分:0)
或者,您可以使用内部查询来执行此操作。
SQL> INSERT INTO <NEW_TABLE> SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM <OLD_TABLE>);
希望这有帮助!
答案 5 :(得分:0)
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;
当然替换&lt;&gt;具有实际值的值,并观察您的报价。
答案 6 :(得分:-2)
只是想添加一个对我来说很漂亮的小片段。
INSERT INTO your_target_table 选择 * 来自your_rescource_table WHERE id = 18;
虽然我正在向Sequel Pro致敬,如果您不使用它,我强烈建议您下载它...让生活变得更加轻松