1

SQLについて質問があります。次のSQLテーブルがあります(理解しやすいように簡略化しています):

Client(clientId INT PRIMARY KEY)

製品 (productId PRIMARY KEY)

Order (orderId PRIMARY、Client への外部キーである clientId、Product への外部キーである productId)

また、各製品の在庫数を含むことになっている Inventory というテーブルもあります。Inventory の主キーは productId (主キー) と呼ばれ、Order の外部キーを参照します。残念ながら、Inventory テーブルに追加しようとすると、次のエラーが表示されます。

"The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Order_Iventory1". The conflict occurred in database "GestionInventaire", table "dbo.Inventory", column 'productId'."

Inventory テーブルのプライマリ ID (productId) を、Product テーブルに由来する Order (productId) の外部キーにします。

どんな助けでも大歓迎です!さらに説明が必要な場合は、さらに詳しく説明します。

4

3 に答える 3

1

上記のリストに基づく SQL の例 (SQL Server):

create table client (
  clientid int not null primary key
)
create table product (
  productid int not null primary key
)
create table [order] (
  orderid int not null primary key,
  clientid int not null foreign key references client (clientid),
  productid int not null foreign key references product (productid)
)

insert into client values (1)
insert into product values (1)

insert into [order] values (1,1,1)  -- should work
insert into [order] values (2,1,2)  -- should fail


create table inventory (
    productid int not null foreign key references product (productid),
    stock int not null default 0
)

insert into inventory values (1,10)  -- worked with no problems

外部キー参照は、親テーブルに存在する値をチェックします。外部キー制約エラーが表示された場合は、外部キー制約を持つ列に挿入しようとしている値が、参照する親テーブルに存在しないことを意味します。

于 2012-11-19T23:59:56.467 に答える
1

Inventory の主キーは productId (主キー) と呼ばれ、Order の外部キーを参照します。

なんで?私にとっては、 の主キーが の主キーをInventory参照した方が理にかなっていますProduct

于 2012-11-20T00:10:02.683 に答える
1

各商品の在庫情報がどの程度複雑かによって異なります。

商品ごとに最新の在庫数だけを保存

各製品の現在の在庫数を単純に保存する場合 (たとえば、製品から在庫への 1 対 1 のマッピング)、在庫に独自のテーブルを持つ必要はありません。 Product テーブルに直接在庫数を表示します。

製品情報と在庫データの間のコード モデルに論理的な分割があるかもしれませんが、大量のデータを処理していてパフォーマンスが問題になっている場合を除き、データを複数のテーブルに格納することが必ずしも良い考えであるとは限りません。 . 単一のテーブルに格納されている場合でも、クエリを実行してモデル オブジェクトを構築するときに、データを複数のオブジェクトに分離できます。

(これは、これを行うのが良い考えである正当な状況がないと言っているわけではありませんが、より良い代替手段がない限り、私はそれを考慮しません)

製品ごとに複数セットの在庫数を保存する

一方、在庫レベルの履歴 (Product から Inventory への 1 対多のマッピング) を保存したい場合は、Inventory テーブルを用意するのが理にかなっていますが、それを独自のものにすることをお勧めします。主キーと、productID から Product テーブルへの外部キーを持つ。

たとえば、"InventoryID" (主キー)、"ProductID" (Product.ProductID の外部キー)、および在庫数を格納するために必要な列を含む在庫テーブル。

Order テーブルへの外部キーを使用する理由

いずれにせよ、Inventory.productID が Order.productID の外部キーであることは実際には意味がありません。在庫は注文ではなく製品に関連しているためです (およびその場合、構造はもう少し複雑になります)。

于 2012-11-20T00:32:50.267 に答える