按ID的ID复制数据库行

时间:2011-11-28 22:10:52

标签: php mysql

我们可以根据它的ID简单地复制数据库中的条目,而不必提及要复制的该行的所有字段名称。

我有一行看起来像

id name last city state whatever
1  joe  doe  xyz  NY    yyy

我想复制一份。 id是自动增量。最简单的方法是什么?

4 个答案:

答案 0 :(得分:2)

显示您正在做的最明确的方法是明确命名列。这样可以确保您获得所需的功能,并且对于必须在您之后修改此代码的任何人都可以清楚。

INSERT INTO yourTable(name, last, city, state, whatever)
SELECT name, last, city, state, whatever
FROM yourTable
WHERE id = 1

如果您确实希望由于未知字段而动态插入记录,则需要使用来自INFORMATION_SCHEMA.COLUMNS的动态SQL和数据,并在循环或类似结构中自行构建字段名称。

答案 1 :(得分:2)

如果您不想列出必须使用information_schema和预习语句播放的所有字段。

这是一个例子

set @str = (select concat('insert into ', table_name,' (', group_concat(column_name),')',' select ',group_concat(column_name),' from ', table_name, ' where id = 1') from 
information_schema.columns
where table_schema = 'your_db' and table_name = 'your_table'
and column_key <> 'PRI');
prepare stmt from @str;
execute stmt;
deallocate prepare stmt;

您甚至可以在存储过程中转换它,以这种方式传递三个参数(id,表名和数据库名称):

delimiter //
drop procedure if exists copy_record //
create procedure copy_record(in my_id int, in my_db varchar(50), in my_table varchar(50) )
begin
set @str = (select concat('insert into ', table_name,' (', group_concat(column_name),')',' select ',group_concat(column_name),' from ', table_name, ' where id = ',my_id) from 
information_schema.columns
where table_schema = my_db and table_name = my_table
and column_key <> 'PRI');
prepare stmt from @str;
execute stmt;
deallocate prepare stmt;
end; //
delimiter ;

call copy_record(1,'db_name','table_name');

答案 2 :(得分:2)

根据您对@Adam Wenger的回答的评论,我只会读取一个查询中的所有字段,然后构建一个跳过id字段的新查询。

类似的东西:

SELECT * FROM table_name WHERE id=some_id

PHP:

$sql = "INSERT INTO table_name SET ";
$first = true;
foreach ($row as $key => $value)
{
  if ($key != 'id')
  {
     if ($first) 
     {
        $first = false;
     }
     else
     {
       $sql .= ", ";
     }
     $sql .= '`' . $key . "`='" . $value . "'";
  }
}
// run query

顺便说一句,我会在PDO中为两个查询生成一个准备好的语句,以便我不必担心转义数据。

答案 3 :(得分:0)

我也喜欢用不同的方式。如果安全措施中MySQL db用户帐户没有DROP权限:

SELECT `col1`, `col2`, `col3` FROM `table`

将结果放入数组中,然后将数组插入数据库。如果要修改要包含的名称,也可以提供帮助 - 复制后。

INSERT INTO `table` (`col1`, `col2`, `col3`) VALUES (?,?,?)

占位符可以是变量数组访问器($ name - 其中$ name = $ array [0])。这可能是多个步骤,但在复制的情况下,您很可能复制一行。如果有多行,则可能是一个较慢的过程,然后另一个回答。