2008-12-09 65 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科拉姆在上述声明