2008-12-09 67 views
6

我的表格有大量的列。我有一個命令來複制一些數據 - 將其視爲克隆產品 - 但由於列可能會在未來發生變化,我只想從表中選擇所有內容,只更改一列的值而不必參考其餘的部分。如何複製記錄,只更改ID?

,而不是如:

INSERT INTO MYTABLE (
SELECT NEW_ID, COLUMN_1, COLUMN_2, COLUMN_3, etc 
FROM MYTABLE) 

我想類似的東西

INSERT INTO MYTABLE (
SELECT * {update this, set ID = NEW_ID} 
FROM MYTABLE) 

有沒有一種簡單的方法來做到這一點?

這是一個iSeries上的DB2數據庫,但歡迎任何平臺的答案。

回答

10

你可以這樣做:

create table mytable_copy as select * from mytable; 
update mytable_copy set id=new_id; 
insert into mytable select * from mytable_copy; 
drop table mytable_copy; 
1

你的例子應該幾乎工作。 只需將新表的列名添加到它。


INSERT INTO MYTABLE 
(id, col1, col2) 
SELECT new_id,col1, col2 
FROM TABLE2 
WHERE ...; 
+1

,對於指定的列僅複製數據 - 我的目的是爲了避免上市的每一個列。我會讓問題更清楚 - 謝謝。 – 2008-12-09 12:30:03

+1

如何創建一個函數或存儲過程或任何動態爲您構建查詢? – Salamander2007 2008-12-09 12:37:55

+0

仍然意味着您必須指定字段儘管... – 2008-12-09 12:45:18

3

我不認爲這是可行的完全在SQL而不去創建一個臨時表的麻煩。在內存中執行它應該快得多。請注意,如果您使用臨時表路徑,則必須爲每個函數調用選擇一個唯一名稱,以避免代碼同時運行兩次並將兩行數據壓縮到一個臨時表中的爭用情況。

我不知道你正在使用什麼樣的語言,但它應該有可能獲得你的程序中的字段列表。我會做這樣的:

array_of_field_names = conn->get_field__list; 
array_of_row_values = conn->execute ("SELECT... "); 
array_of_row_values ["ID"] = new_id_value 
insert_query_string = "construct insert query string from list of field names and values"; 
conn->execute (insert_query_string); 

然後你就可以封裝,作爲一個功能,只是把它指定表,舊的標識,新標識和它會工作,它的魔力。

在Perl下面的代碼片斷會做:

$table_name = "MYTABLE"; 
$field_name = "ID"; 
$existing_field_value = "100"; 
$new_field_value = "101"; 

my $q = $dbh->prepare ("SELECT * FROM $table_name WHERE $field_name=?"); 
$q->execute ($existing_field_value); 
my $rowdata = $q->fetchrow_hashref; # includes field names 
$rowdata->{$field_name} = $new_field_value; 

my $insq = $dbh->prepare ("INSERT INTO $table_name (" . join (", ", keys %$rowdata) . 
    ") VALUES (" . join (", ", map { "?" } keys %$rowdata) . ");"; 
$insq->execute (values %$rowdata); 

希望這有助於。

2

好吧,試試這個:

declare @othercols nvarchar(max); 
declare @qry nvarchar(max); 

select @othercols = (
select ', ' + quotename(name) 
from sys.columns 
where object_id = object_id('tableA') 
and name <> 'Field3' 
and is_identity = 0 
for xml path('')); 

select @qry = 'insert mynewtable (changingcol' + @othercols + ') select newval' + @othercols; 

exec sp_executesql @qry; 

之前運行「sp_executesql的」行,請不要「選擇@qry」查看命令是什麼,你要運行。

當然,您可能希望將其存儲在存儲過程中,並傳遞一個變量而不是'Field3'位。

Rob

-1

我從來沒有使用db2,但在mssql中,您可以使用以下過程來解決它。這個解決方案只適用於你不在意這些物品獲得了什麼新ID的情況。

1.)使用相同的方案創建新表,但id列自動增加。 (mssql「標識規範= 1,標識增量= 1)

2。)不是一個簡單的

insert into newTable(col1, col2, col3) 
select (col1, col2, col3) from oldatable 

應足夠,確保不包括您的ID科拉姆在上述聲明