3

背景情報

と の 2 つのテーブルを持つデータベースがありますPhonesCarriers

電話 -> キャリア

Phones(主キー: Phones.ID; 外部キー: Phones.CarrierID) がリンクされています

Carriers(主キー: Carriers.ID; 外部キー: Carriers.RegionID)。

Phones.CarrierIDとの両方のデータ型Carriers.IDは bigint です。わかりにくかったらすいません!

問題

電話テーブルに Nokia Lumia 1020 というレコードがあります。列を介して Carriers テーブルの複数のレコードにリンクできるようにする必要がありPhones.CarrierIDます。Phonesテーブルに Nokia Lumia 1020 の複数のレコードを作成せずにこれを行うにはどうすればよいですか?

4

4 に答える 4

4

多対多の関係があります。通常、これは 2 つのデータ テーブルの間にテーブルを追加することで実装されます。

Phones -> PhoneCarriers -> Carriers

PhoneCarrier次のようになります。

PhoneCarrierID
PhoneID (FK)
CarrierID (FK)

そのシナリオでは、Phoneから直接外部キーを取得することはありません。Carrier

于 2013-09-19T20:20:35.313 に答える
3

PhoneCarriers テーブルを使用する必要があります。

PhoneCarriers
-------------
PhoneCarrierID <-- Unimportant PK
PhoneID        <-- FK to Phones Table
CarrierID      <-- FK to Carrier Table.

これは、複数のエントリが存在する場所です。

于 2013-09-19T20:19:53.227 に答える
2

列を削除しPhones.CarrierIDます。次に、とのCarriersToPhones2 つの列を持つ3 番目のテーブルを作成します。これらの 2 つの列を使用して、必ず複合主キーまたは一意キーを作成してください。Phones.IDCarriers.ID

于 2013-09-19T20:19:57.510 に答える
2

他の人が既に述べたように、電話と通信事業者の間の関係を格納するテーブルが必要です。これを示すテスト スキーマを作成しました。

USE Test;

CREATE TABLE Phones 
(
    PhoneID INT NOT NULL CONSTRAINT PK_Phones_PhoneID PRIMARY KEY CLUSTERED IDENTITY(1,1)
    , PhoneName NVARCHAR(255) NOT NULL
);

CREATE TABLE Carriers
(
    CarrierID INT NOT NULL CONSTRAINT PK_Carriers_CarrierID PRIMARY KEY CLUSTERED IDENTITY(1,1)
    , CarrierName NVARCHAR(255) NOT NULL
);

CREATE TABLE PhonesCarriersXRef
(
    PhoneID INT NOT NULL CONSTRAINT FK_PhonesCarriersXRef_Phones_PhoneID FOREIGN KEY REFERENCES Phones (PhoneID) ON DELETE CASCADE ON UPDATE CASCADE
    , CarrierID INT NOT NULL CONSTRAINT FK_PhonesCarriersXRef_Carriers_CarrierID FOREIGN KEY REFERENCES Carriers (CarrierID) ON DELETE CASCADE ON UPDATE CASCADE 
    CONSTRAINT PK_PhonesCarriersXRef PRIMARY KEY CLUSTERED (PhoneID, CarrierID)
);

INSERT INTO Phones (PhoneName) VALUES ('Nokia Lumia 1020');
INSERT INTO Phones (PhoneName) VALUES ('Nokia Lumia 920');

INSERT INTO Carriers (CarrierName) VALUES ('AT&T');
INSERT INTO Carriers (CarrierName) VALUES ('Verizon');

INSERT INTO PhonesCarriersXRef (PhoneID, CarrierID) VALUES (1,1);
INSERT INTO PhonesCarriersXRef (PhoneID, CarrierID) VALUES (1,2);
INSERT INTO PhonesCarriersXRef (PhoneID, CarrierID) VALUES (2,1);
INSERT INTO PhonesCarriersXRef (PhoneID, CarrierID) VALUES (2,2);

SELECT C.CarrierName, P.PhoneName
FROM PhonesCarriersXRef X
    INNER JOIN Phones P ON X.PhoneID = P.PhoneID
    INNER JOIN Carriers C ON X.CarrierID = C.CarrierID
ORDER BY C.CarrierName, P.PhoneName;

これは以下を返します。

ここに画像の説明を入力

于 2013-09-19T20:32:42.620 に答える