1
INSERT INTO tbl_AllParcel
           ([P_ID],[Sub_ID],[X_COORD],[Y_COORD])

VALUES 
       ('0706' , '002' , '579002' , '1167176'),
       ('0706' , '003' , '579013' , '1167153')

P_ID と Sub_ID は、複合キーを形成するそれぞれの主キーです。上記のコードを実行すると、次のエラー メッセージが表示されます。複合キーだけで一意の値を作成する必要はありませんか?

メッセージ 2627、レベル 14、状態 1、行 2 PRIMARY KEY 制約 'PK_tbl_Parcel' の違反。オブジェクト 'dbo.tbl_AllParcel' に重複するキーを挿入できません。ステートメントは終了されました。

4

2 に答える 2

2

2 つの行を別々に挿入してみてください。少なくとも 1 つが失敗すると思いますが、必ずしも両方が失敗するとは限りません。個々の列に複合主キー/一意制約と別の一意制約の両方がない限り、エラーは挿入ステートメントでのみ見つかったデータから発生していません。

また、一緒に複合キーを形成する 2 つの主キーがあることを説明できますか? テーブルは主キーを 1 つだけ持つことができます。テーブル定義をスクリプト化して (SSMS のオブジェクト エクスプローラーで右クリックし、[テーブルをスクリプト化]、[作成先]、[クリップボード])、それを質問に追加して、用語に同意できるようにしてもらえますか?

P_ID に一意の制約があり、Sub_ID に一意の制約がある場合、意図したものとは対照的に、テーブルに各値を 1 つしか持つことができません (組み合わせのみが一意である必要があります)。個々の列に一意の制約がある場合、これは無効です。結合された制約には違反していませんが、最初の列の制約には違反しているためです。

P_ID Sub_ID
---- ------
0706 002
0706 003

これを修正する方法をお知らせします (そして、P_ID = '0706' および Sub_ID = '002' または '003' のいずれかの行がまだないことを確認します)。これを言うとどうなりますか:

SELECT COUNT(*) FROM dbo.tbl_AllParcel WHERE P_ID = '0706' AND Sub_ID = '002';

? またはもっと重要なことは、提供するスクリプトに応じて、次のようになると思います。

SELECT COUNT(*) FROM dbo.tbl_AllParcel WHERE P_ID   = '0706';
SELECT COUNT(*) FROM dbo.tbl_AllParcel WHERE Sub_ID = '002';

個々の列にキーを追加せずに複合キーを作成するには、個々の列を選択しません。を使用してこれを行う方法は次のCREATE TABLEとおりです。

CREATE TABLE dbo.tbl_AllParcel2
(
  P_Id   CHAR(4),
  Sub_Id CHAR(3),
  ... other columns,
  CONSTRAINT PK_Parcel PRIMARY KEY(P_Id, Sub_Id)
);

現在UIを使用していると思います。テーブル デザイナーでこれを実行しようとしないでください。ゴミの塊です。DDL を学んでください。Books OnlineのCREATE TABLEおよびALTER TABLEトピックには、さまざまな制約やその他のテーブル属性を定義するための例がたくさんあります。

テーブルの作成 (MSDN)
テーブルの変更 (MSDN)

于 2012-04-24T21:30:39.000 に答える
1

このエラーは、その複合キーのテーブルにこれら 2 つのうちの 1 つが既にあることを意味します。

'0706' , '002' 
'0706' , '003' 
于 2012-04-24T20:48:15.027 に答える