3

誰かが私にこれを説明して解決するのを手伝ってもらえますか?

http://sqlfiddle.com/#!6/2adc7/9

INSERTステートメントがFOREIGNKEY制約「FK_tblMobileForms_tblForms」と競合しました。データベース"db_6_2adc7"、テーブル "dbo.tblForms"、列'fm_id'で競合が発生しました。:tblMobileForms(fm_name)値に挿入('lol')

私のスキーマのIDはtblMobileFormsからtblForms.fm_idへの外部キーです

4

3 に答える 3

3

やろうとしていることを行うために、tblMobileFormsでFKをIDとして設定することはできません。詳細については、以下の私のフィドルを参照してください。

http://sqlfiddle.com/#!6/be6f7/2

または、tblMobileFormsに独自の代理キーを設定し、tblFormsテーブルとは異なるFK列を設定することもできます。

于 2012-10-25T14:47:38.960 に答える
1

テーブル上のPKはtblMobileForms、同じテーブル上のFKと同じ名前です。PKがIDENTITY列であることがわかると、値が一致しなくなる可能性があります。

私のフィドルでは、tblFormsテーブルには60代後半のIDが含まれていました。子テーブルでを実行INSERTすると、親テーブルに存在しないID1のレコードが追加されます。

テーブルに新しい行を作成し、tblMobileFormsそれを親テーブルに参照します。

于 2012-10-25T14:45:49.107 に答える
1

トリガーを使用して、INSTEAD OF挿入された各モバイルフォームにランダムなIDを適用できます。

CREATE TRIGGER dbo.tblMobileForms_Insert
    ON dbo.tblMobileForms
    INSTEAD OF INSERT

AS
BEGIN
    DECLARE @Inserted TABLE (fm_ID INT, fm_html_file VARBINARY(MAX), fm_name NVARCHAR(50));
    INSERT @Inserted (fm_ID, fm_html_File, fm_Name)
    SELECT  fm_ID, fm_html_File, fm_Name
    FROM    inserted;

    IF EXISTS (SELECT 1 FROM @Inserted WHERE fm_ID IS NULL)
        BEGIN
            WITH NewRows AS
            (   SELECT  fm_ID, fm_html_File, fm_Name, RowNumber = ROW_NUMBER() OVER (ORDER BY fm_name)
                FROM    @Inserted
                WHERE   fm_ID IS NULL
            ), AvailableIDs AS
            (   SELECT  fm_ID, RowNumber = ROW_NUMBER() OVER (ORDER BY fm_ID)
                FROM    tblForms f
                WHERE   NOT EXISTS
                        (   SELECT  1
                            FROM    tblMobileForms m
                            WHERE   f.Fm_ID = m.fm_ID
                        ) 
                AND     NOT EXISTS
                        (   SELECT  1
                            FROM    inserted i
                            WHERE   f.fm_ID = i.fm_ID
                        ) 
            )
            UPDATE  NewRows
            SET     fm_ID = a.fm_ID
            FROM    NewRows n
                    INNER JOIN AvailableIDs a
                        ON a.RowNumber = n.RowNumber

            IF EXISTS (SELECT 1 FROM @Inserted WHERE fm_ID IS NULL)
                BEGIN 
                    RAISERROR ('Not enough free Form IDs to allocate an ID to the inserted rows', 16, 1);
                    RETURN;
                END
        END

        INSERT dbo.tblMobileForms (fm_ID, fm_html_File, fm_Name)
        SELECT  fm_ID, fm_html_file, fm_name
        FROM    @Inserted

END

各行が挿入されると、トリガーはtblFormsで次に使用可能なIDをチェックし、fm_id指定されていない挿入された行に順番に適用します。空きIDがない場合tblForms、トリガーはエラーをスローするため、1対1の関係が維持されます(tblMobileForms.fm_idもPKであるため、エラーはとにかくスローされます)。

Nbこれには、tblForms.fm_IDがIDではなくint列である必要があります。

于 2012-10-25T15:12:37.770 に答える