2011-11-28 61 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])。這可能是多個步驟,但在複製的情況下,您很可能會複製單個行。如果有多行,它可能是一個較慢的過程,然後另一個答案。