2

11 個または 12 個の数値の浮動小数点数である contactid フィールドを持っています。数値を挿入すると、浮動小数点数が科学的表記法に変更され、重複キー エラーが発生します。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.

理由はありますか?

このようにDB設計をセットアップすることは、本来あるべき方法ではないことを知っていますが、それは私が取り組まなければならないものです。ですから、デザインを変更するために私のものではないため、デザインを変更する必要があるとは言わないでください.

 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
4

2 に答える 2

3

Floatapproximate number data type常に正確な数値を表示するとは限らないことを意味します。主キー列に設定できる最悪のデータ型です。主キーに多数の数値がある場合BIGINTは、これを使用する必要がありExact number data typeます。
float は正確な値を表していないため、2 つの異なる値を持つ可能性がありますが、float はそれらをほぼ同じ値またはほぼ同じ値と見なす可能性があり、重複する PRIMARY KEY 制約エラーが発生します。
私の提案
列のデータ型を変更するか、別の列を追加して主キーとして使用します。
できれば INT を使用してください。テーブルに 2,147,483,647 を超えるレコードがある場合は、BIGINT を使用できます。正直なところ、この INT の限界に近づいた場合は、テーブル パーティショニングを検討する必要があります。

于 2013-11-08T22:04:48.620 に答える
0

メタ値とメインの contactid 列のデータ型は何ですか? 両方の列のデータ型は同じですか?

何年も前に、2 つの異なるサーバーでのデフォルトの照合が原因で同様の問題が発生したことをぼんやりと覚えています。数値を varchar に変換してから挿入に戻すことで問題を回避したと思います。これがまったく役立つかどうかはわかりませんが、とにかく試してみる価値があるかもしれません.

ただし、テーブルが主キーID列にfloatを使用している場合、@Muhammed Aliには同意します。int または数値を使用する必要があります。

于 2013-11-08T22:04:17.477 に答える