我的表有很多列。我有一个复制一些数据的命令 - 将其视为克隆产品 - 但由于列可能在将来发生变化,我只想从表中选择所有内容,只更改一列的值而不必参考其余的。
例如,而不是:
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数据库,但欢迎任何平台的答案。
答案 0 :(得分: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 :(得分: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);
然后你可以把它作为一个函数封装起来,只需要调用它来指定table,old id和new id,它就会起作用。
在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 :(得分: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”位。
罗布
答案 3 :(得分:1)
你的榜样几乎可以奏效。 只需添加新表的列名即可。
INSERT INTO MYTABLE
(id, col1, col2)
SELECT new_id,col1, col2
FROM TABLE2
WHERE ...;
答案 4 :(得分:-1)
我从未使用过db2,但在mssql中你可以通过以下步骤解决它。这个解决方案只有在您不关心项目获得的新ID时才有效。
1。)创建具有相同方案的新表,但id列自动增加。 (mssql“identitity specification = 1,identity increment = 1)
2。)而不是简单的
insert into newTable(col1, col2, col3)
select (col1, col2, col3) from oldatable
应该足够了,请确保不要在上面的陈述中包含你的id列