3

背景信息

我有一个包含两个表的数据库:PhonesCarriers

电话 -> 运营商

Phones(主键:Phones.ID;外键Phones.CarrierID:)链接到

Carriers(主键:Carriers.ID;外键:Carriers.RegionID)。

Phones.CarrierID两者的数据类型Carriers.ID都是 bigint。对不起,如果这令人困惑!

问题

我的电话表中有一条名为诺基亚 Lumia 1020 的记录。我需要能够通过该Phones.CarrierID列将其链接到运营商表中的多个记录。如果不在表中为诺基亚 Lumia 1020 创建多条记录,我将如何执行此操作Phones

4

4 回答 4

4

你有一个多对多的关系。通常这是通过在两个数据表之间添加一个表来实现的:

Phones -> PhoneCarriers -> Carriers

PhoneCarrier看起来像:

PhoneCarrierID
PhoneID (FK)
CarrierID (FK)

在那种情况下,您将不会直接从Phoneto获得外键。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

正如其他人已经提到的,您需要一个表来存储电话和运营商之间的关系。我创建了一个测试模式来说明这一点:

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 回答
2

移除Phones.CarrierID列。然后创建CarriersToPhones具有两列的第三个表:Phones.IDCarriers.ID。请务必使用这两列创建复合主键或唯一键。

于 2013-09-19T20:19:57.510 回答