除了一列之外,我有两个具有相同结构的表...表2中有另外一列我将插入CURRENT_DATE()
我想将table1中的所有值复制到table2.
如果我使用
INSERT INTO dues_storage SELECT * FROM dues WHERE id=5;
Run Code Online (Sandbox Code Playgroud)
它会抛出一个错误,指出列数的差异.
我有两个问题:
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的评论
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是正确的地方.
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)
| 归档时间: |
|
| 查看次数: |
117022 次 |
| 最近记录: |