浮动在插入时改为科学记数法

时间:2013-11-08 21:26:39

标签: sql sql-server tsql

我有一个带有11或12个数字的浮点数的接收字段,当我插入数字时,浮点数变为科学记数,导致重复键错误。如果我只是运行Select查询,我会得到我期望的结果。但是当我进行插入时,我得到以下错误。我已经尝试了几乎所有的演员转换,并且最终还是以科学记数法结束了?

Msg 2627, Level 14, State 1, Line 1 Violation of PRIMARY KEY constraint 'metavalues_primarykey'. Cannot insert duplicate key in object 'dbo.metavalues'. The duplicate key value is (4.56219e+014, 41070, 0). The statement has been terminated.

知道为什么吗?

我知道以这种方式设置数据库设计不是应该的方式,但这是我必须使用的。所以请不要告诉我,我需要改变我的设计,因为我不能这样做而不是我的设计更改。

 contactid       fieldgroup metatableid Subfields parent Metavalue
 456209564532953    1004    41140              0    0   NULL
 456209592021740    1004    41130              0    0   NULL
 456210014777935    1004    41097              0    0   NULL
 456211077079073    1004    41107              0    0   NULL




INSERT INTO contactease.dbo.metavalues
        (contactid,
         fieldgroup,
         metatableid,
         subfield,
         metaflags,
         metavalue)
SELECT DISTINCT m.contactid,
            1004,
            mt.metatableid,
            0,
            0,
            NULL
FROM  interact.dbo..[INT_LST_CUSTOM_ENUM] sic
   INNER JOIN interact.dbo.INT_AUX_LST_CUSTOM c
           ON c.LST_CUSTOM_ENUM_ID = sic.LST_CUSTOM_ENUM_ID
              AND c.DIRECTORY_ID <> -4
   INNER JOIN contactease.dbo.main m
           ON m.custnum1 = c.LISTING_ID
   INNER JOIN contactease.dbo.metatable mt
           ON mt.metaname = sic.LST_CUSTOM_ENUM_NM

2 个答案:

答案 0 :(得分:3)

Floatapproximate number data type,这意味着它不会始终显示确切的数字,您的主键列上可以包含的最差数据类型,如果您的主键中有大量数字,则应该使用BIGINT Exact number data type 由于float不表示确切的值,您可能有两个不同的值,但float可能会认为它们几乎/ appoxi相同的值,并且您得到重复的PRIMARY KEY约束错误。
我的建议
更改列的数据类型或添加另一列以用作主键。
最好使用INT,如果表中有超过2,147,483,647条记录,则可以使用BIGINT。老实说,如果你有任何接近INT限制的地方,你应该考虑表格分区。

答案 1 :(得分:0)

metavalues和main中的contactid列的数据类型是什么,两列的数据类型是否相同?

我依稀记得几年前有一个类似的问题,这是由于两个不同服务器上的默认排序规则,我相信我通过将数值转换为varchar然后返回插入来解决问题。我不确定这会对你有什么帮助,但无论如何它可能会给你一些尝试。

我确实同意@Muhammed Ali,如果你的表使用浮点作为主键id列是不好的。应该使用int或数字。