2016-03-21 23 views
2

私は私のウェブサイトhosterで私の生産SQL Server databasemasterdetailtableを持っています。多くのインサートは私のAndroid appsをサービスする私のRESTサービスによって毎日行われます。サービスは、このすべては、時間の99.999%作品detail table.だけにmaster、その後、多くのインサートへの挿入を行い、すべて一度の間、私はこの取得を開始:奇妙な慢性の外部キー制約の問題

INSERT文を競合FOREIGN KEYで制約 "FK_TTLegs_TTMaster"。競合がデータベース "SQL2008R2_797967_golfstats"、テーブル "dbo.TTMaster"、列 'emailaddress'で発生しました。ステートメントは終了されました。 12703032675 =キー:もう一度

は今、私はこの文は、そのようなmasterレコードがないとき、私はdetail表にinsertをやっていると言っていることを実感してみてください。しかし〜がある。

この問題は1年に4〜5回起こり、何が起こっているか把握できませんでした。 DBはSQL Server 2014です。 emailaddressnvarchar 50です。

+0

これは文字フィールドでフリーテキストフィールドである可能性があるため、 'emailaddress'フィールドの先頭または末尾の空白をチェックしますか?それが原因の一つかもしれません。 – AKS

+0

私はそれがSQL Serverのデフォルトの動作だと思います。マスターテーブルに電子メールアドレスフィールドを定義し、それを詳細テーブルの外部キーとして設定しました。そのため、sql-serverは、マスター表にディテール表のすべてのエントリが存在することを検証します。ありがとう。 – bmsqldev

答えて

1

これはまれにしか発生しないため、この外部キーを無効にして、この検証に失敗したレコードがログテーブルに格納されるSQLジョブを使用してチェックします。このような何か:

SELECT D.* 
FROm dbo.FK_TTLegs_TTMaster D 
    WHERE NOT EXISTS (SELECT 1 FROM dbo.TTMaster M ON M.emailadrress = D.emailadrress) 

はこのように、あなたは一時的に無効なデータを許可していますが、制約に違反し、正確な記録を見つけることができます。

ジョブは、エラーが発生したとき(電子メールなど)に表示されるように頻繁に実行され、通知されます。

注:比較はトラブル(、照合に応じて、先頭または末尾の空白を)につながる可能性があるためVARCHAR Sを使用してFKとしてSは良いアイデアではありません、それは細部に性能面(各INSERTまたはUPDATEではありませんテーブルはマスタテーブルに対してデータを検証しなければならず、文字列の比較は整数比較よりもコストがかかります)。

[EDIT]

テキストの上には、調査のために有用であるかもしれないが、私は本当の問題は、テーブルのデザインだと思います。電子メールアドレスがマスターとディテールで同じになる必要がある場合は、マスターテーブルにのみ格納する必要があります。

  1. INSERTは、アプリケーション層から実行された場合(自然の1がmaster

  2. で使用することができない場合は、マスターとディテールのテーブルをリンクするsurrogate keyを使用しdbo.TTLegs_TTMaster

  3. からemailaddressを削除します.NET,JavaなどINSERTSQL Server(インポートで行われている場合)、それはINSERT

  4. 前に、マスターテーブルに対してそれを検証することができ、ETLなど)、それは試合の電子メールアドレスを持っているだけで、それらの挿入を実行し、中に報告することができますエラーがこの検証に失敗したレコードを記録します。

+0

ありがとう。それは良い提案です。 –