2011-11-28 58 views
4

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

我有一个排,看起来像

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

我想作一个副本。 id是自动增量。什么是最简单的方法来做到这一点。

+0

请详细说明你想怎么做? SQL,PHP页面,EXE,夜间工作等。 – Robert

+2

PHP,我有我的标签 – Pinkie

+0

请参阅:http:// stackoverflow。com/questions/729489/duplicate-copy-records-in-the-same-mysql-table –

回答

2

在@Adam温格的回答您的意见,我只想读一个查询中的所有字段,然后建立一个新的查询跳过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两个查询一份声明,这样我就不必担心逃避数据。

+0

谢谢。这对我有用。 – Pinkie

2

最明确的方式来显示你正在做的事情是明确命名的列了。这将确保你得到你想要的功能,以及是明确的人谁拥有你以后要修改这个代码。

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

如果你真的想要做的插入记录动态由于未知的领域,你将需要使用动态SQL和数据INFORMATION_SCHEMA.COLUMNS,建立字段名自己在一个循环中,或类似的结构。

+0

谢谢但在我的问题,我问是否有办法做到这一点,而不必提及所有的字段名称 – Pinkie

+0

我不认为你可以在不调用列的情况下做到这一点,因为ID是一个自动增量,你不能直接插入到你的表()中,因为你不希望自动增量填充相同的值。 – Robert

+3

@Pinkie,你需要支付按键吗? –

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'); 
+0

谢谢。 +1 .. – Pinkie

0

我也喜欢用不同的方式。在保安措施,其中MySQL数据库用户帐户不具有DROP权限情况:

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

认沽结果到一个数组,然后将数组到数据库中。如果您想修改名称以包含 - 复制后也有帮助。

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

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