2011-10-21 13 views
0

プライマリキーがCODE_TARIF, UNITE, MODE_LIVの3つの列で構成されるテーブルがあります。私のテーブルには、MODE_LIV = 2という3つのレコードがあります。次に、MODE_LIV = 4というレコードを挿入します。SQL INSERT違反プライマリキー

INSERT INTO T_TARIF (
    CODE_TARIF, ZONE, UNITE, MODE_LIV, LIBELLE, TR_DEBUT, TR_FIN, MONTANT 
) 
SELECT 'Livr_A_50_99', '2', '1', '4', 'sdg', '50', '99', '90' 
UNION ALL 
SELECT 'Livr_A_50_99', '2', '1', '4', 'sdg', '50', '99', '90' 
UNION ALL 
SELECT 'Livr_A_50_99', '2', '1', '4', 'sdg', '50', '99', '90' 

MODE_LIV = 2MODE_LIV = 4に等しくないので、任意の意味をなさないエラー(主キーの違反)を返します。

自動増分ID列として代理キーを追加できますが、私の状況ではオプションではありません。

+3

と同一ではないように、あなたはPKのすべての列に同じ値を3行を挿入している、あなたのデータを変更します。 (実際にはすべての非PK列) –

答えて

4

主キーフィールドに同じデータの3行を挿入しています。
もちろん、あなたはPK違反を受けるつもりです。

変更するコード:私はPKを構築する三つのフィールドが同じであるので、あなたが侵害された主キーを(持つテーブルに挿入しようとしている3つの完全に等しいレコードを表示

あなたのクエリを見て
INSERT INTO T_TARIF (CODE_TARIF, ZONE, UNITE, MODE_LIV, LIBELLE, TR_DEBUT, TR_FIN, MONTANT) 
SELECT 'Livr_A_50_99', '2', '1', '3', 'sdg', '50', '99', '90' 
UNION ALL 
SELECT 'Livr_A_50_99', '2', '1', '4', 'sdg', '50', '99', '90' 
UNION ALL 
SELECT 'Livr_A_50_99', '2', '1', '5', 'sdg', '50', '99', '90' 

//Different data for every row ^
1

'Livr_A_50_99', '1', '4')!

1

「3つの主キー」は、複合キーを意味すると思います。あなたのケースでは、プライマリキーは重複データを持つことができず、CODE_TARIF,UNITE、およびMODE_LIVの構成は3つの重複レコードです。

1

私が正しくあなたのポストを読めば、あなたは(CODE_TARIF、UNITE、およびMODE_LIV)からなる複合PKを持って

この場合、あなたの挿入はPK

'Livr_A_50_99','1', '4' 
ですべての3行を挿入しようとします

全く同じデータを3回挿入するつもりがない場合は、UNION ALLUNIONに置き換えます。この場合、1回だけ行が挿入されます。

あなたがPKをインクリメント代理オートを使用したい場合は代わりに、あなたは主キーがデータの単一の行を識別するために使用され

CREATE TABLE T_TARIF 
(
    T_TARIF_Id INT identity(1,1) NOT NULL, 
... Other fields here 

) 
GO 

ALTER TABLE T_TARIF ADD CONSTRAINT PK_Tariff PRIMARY KEY(T_TARIF_Id) 
GO 
1

にあなたのテーブルのDDLを変更する必要があります。

例では、同じ3行のデータを挿入しています。これは、主キーが3つの行すべてを識別することを意味します。これは定義上の主キー違反です。

あなたのオプションは以下のとおりです。
-
行の間を区別するために(たとえば、自動インクリメントIDのような)新しいフィールドを追加 - 挿入重複行
のひとつ - それは一度だけ挿入する必要がなるように、あなたのデータを変更します
(このような「数」フィールドを追加するなど) - PKフィールドは、他の行