将一条记录链接到单独表中的多条记录

时间:2013-09-19 20:16:13

标签: sql sql-server database

背景资料

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

电话 - >载体

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

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

Phones.CarrierIDCarriers.ID的数据类型都是bigint。 很抱歉,如果这令人困惑!

问题

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

4 个答案:

答案 0 :(得分:4)

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

Phones -> PhoneCarriers -> Carriers

PhoneCarrier看起来像:

PhoneCarrierID
PhoneID (FK)
CarrierID (FK)

在该方案中,您不会直接从PhoneCarrier拥有外键。

答案 1 :(得分:3)

您需要使用PhoneCarriers表:

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

这是您存在多个条目的地方。

答案 2 :(得分:2)

删除Phones.CarrierID列。然后创建第三个表CarriersToPhones,其中包含两列:Phones.IDCarriers.ID。请务必使用这两列创建复合主键或唯一键。

答案 3 :(得分: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;

返回以下内容:

enter image description here