我有一个带有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
答案 0 :(得分:3)
Float
是approximate 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或数字。