我在 Firebird 2.5 上工作,我有两个表,它们的所有列都相似,除了一个具有自动递增的主键和主表的非空外键字段 (A)
我知道我可以使用这样的 sql 来插入两个表中的所有值
insert into table1 select * from table2 where somthing = 'foo'
但是字段 (A) 有什么办法可以在同一个 sql 语句中手动插入这个值?因为这是唯一需要手动输入的字段
谢谢
我在 Firebird 2.5 上工作,我有两个表,它们的所有列都相似,除了一个具有自动递增的主键和主表的非空外键字段 (A)
我知道我可以使用这样的 sql 来插入两个表中的所有值
insert into table1 select * from table2 where somthing = 'foo'
但是字段 (A) 有什么办法可以在同一个 sql 语句中手动插入这个值?因为这是唯一需要手动输入的字段
谢谢
您可以明确指定源字段和目标字段(并且您应该select *
;除非您有特定理由,否则不要使用):
insert into table1
(
col1,
col2,
col3,
col4
)
select
col1,
col2,
col3,
'foo'
from table2
where something = 'foo'
出现这篇文章是因为我正在寻找一种解决方案来做同样的事情,但没有对字段名称进行硬编码,因为这些字段可能会添加/删除,并且不想记住更新复制记录过程。
在谷歌搜索了一段时间后,我想出了这个解决方案:
select cast(list(trim(RDB$FIELD_NAME)) as varchar(10000))
from RDB$RELATION_FIELDS
where RDB$RELATION_NAME = 'YOUR_TABLE'
and RDB$FIELD_NAME not in ('ID') -- include other fields to NOT copy
into :FIELD_NAMES;
NEW_ID = next value for YOUR_TABLE_ID_GENERATOR;
execute statement '
insert into YOUR_TABLE (ID,' || FIELD_NAMES || ')
select ' || cast(:NEW_ID as varchar(20)) || ',' ||
FIELD_NAMES || '
from YOUR_TABLE
where ID = ' || cast(:ID_OF_RECORD_TO_COPY as varchar(20));
希望这可以为遇到此问题的其他人节省一些时间!