我有一个包含两个表的数据库:Phones
和Carriers
电话 - >载体
Phones
(主键:Phones.ID
;外键:Phones.CarrierID
)已链接到
Carriers
(主键:Carriers.ID
;外键:Carriers.RegionID
)。
Phones.CarrierID
和Carriers.ID
的数据类型都是bigint。 很抱歉,如果这令人困惑!
我的电话表中有一个名为Nokia Lumia 1020的记录。我需要能够通过Phones.CarrierID
列将其链接到运营商表中的多个记录。如果不在Phones
表格中为诺基亚Lumia 1020创建多条记录,我该如何做?
答案 0 :(得分:4)
你有多对多的关系。通常,这是通过在两个数据表之间添加一个表来实现的:
Phones -> PhoneCarriers -> Carriers
PhoneCarrier
看起来像:
PhoneCarrierID
PhoneID (FK)
CarrierID (FK)
在该方案中,您不会直接从Phone
到Carrier
拥有外键。
答案 1 :(得分:3)
您需要使用PhoneCarriers表:
PhoneCarriers
-------------
PhoneCarrierID <-- Unimportant PK
PhoneID <-- FK to Phones Table
CarrierID <-- FK to Carrier Table.
这是您存在多个条目的地方。
答案 2 :(得分:2)
删除Phones.CarrierID
列。然后创建第三个表CarriersToPhones
,其中包含两列:Phones.ID
和Carriers.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;
返回以下内容: