源表TEST(摘录)。括号中的值确定日期类型:
ID (integer) | SAMPLES (double precision) | NSAMPLES (double precision)
------------------------------------------------------------------------------
575 10.000000 10.000000
有问题的SQL命令是这样的:
insert into TEST
select * from TEST where ID=575;
如果我从开源工具FlameRobin的命令行执行此命令
更新的表格如下所示
ID (integer) | SAMPLES (double precision) | NSAMPLES (double precision)
------------------------------------------------------------------------------
575 10.000000 10.000000
810 10.000000 10.000000
如果我从存储过程运行相同的命令(来自FlameRobin或我自己的应用程序使用BDE(Borland数据库引擎)组件)结果就是这个
ID (integer) | SAMPLES (double precision) | NSAMPLES (double precision)
------------------------------------------------------------------------------
575 10.000000 10.000000
810 10.000000 10.000000
811 10.000000 NULL
有趣的是,SAMPLES和NSAMPLES两个列具有相同的日期类型,相同的源值(= 10.000000),并且两者都可以为空。为什么复制从存储过程调用的命令不要复制NSAMPLES列的值?而不是它,它将NULL值插入新记录。
已添加16.11.2012
也许在db管理工具FlameRobin的以下屏幕截图中可以找到一些提示。它们包含存储过程INSERT_TEST和表TEST的完整定义。
为什么字段列表中缺少NSAMPLES列???
答案 0 :(得分:0)
问题在于两种环境对IDENTITY列的不同处理。
相反,这样做:
Insert into TEST(SAMPLES, NSAMPLES)
Select SAMPLES, NSAMPLES
from TEST where ID = 575
即。如果您明确命名所有列,问题就会消失。无论如何,这通常是一个好主意。