SQL数据库设计使用另一个表自动填充表数据

时间:2018-01-20 10:21:27

标签: mysql

创建数据库

CREATE DATABASE nicholasShaffer;

为成员创建表客户以进行注册并将数据存储为主要字段

CREATE TABLE Customers ( 
MemberID int NOT NULL AUTO INCREMENT, 
LastName varchar(255) NOT NULL, 
FirstName varchar(255) NOT NULL, 
City varchar(255) NOT NULL, 
Address varchar(255), 
Zip int NOT NULL, 
CellNumber int NOT NULL, 
PRIMARY KEY MemberID
)

将表DeviceID创建为客户的子表

CREATE TABLE DeviceID ( 
ID int, 
CellNumber int NOT NULL, 
LastName varchar(255) NOT NULL, 
CONSTRAINT PK_ID PRIMARY KEY (LastName, CellNumber)
) 

这就是我遇到问题的地方。表CustomerID.CellNumber应自动从Customers.CellNumber填充,但我的连接语句似乎有些错误,我在这个语句中缺少什么让deviceID.cellnumber填充什么曾经进入过customers.CellNumber>

SELECT deviceid.CellNumber, customers.CellNumber
FROM deviceid
LEFT JOIN customers ON deviceid.CellNumber = customers.CellNumber;

1 个答案:

答案 0 :(得分:0)

我假设您希望能够代表拥有多个设备的单个客户,每个设备都有自己的手机号码。

在这种情况下,CellNumber是设备的属性而不是客户 - 因此它应该出现在前者的表中而不是后者的表中。

由于设备属于单个客户,因此可以使用设备表中的(外部客户)“外键”来关联表。要使用的最佳密钥是相关表的主键。

客户表的主键应该是什么?您试图在两列(CellNumber, LastName)上指定“复合主键”。但是,我们不仅已经决定从此表中删除CellNumber,而且您还试图让MemberID自动递增(这是一件好事),并在MySQL 必须是表的主键。

请记住,密钥的目的是唯一地标识记录; 主键应该是主要用于识别记录的键。 MemberID确实似乎是最合适的主键。

因此我们有:

CREATE TABLE Customers ( 
  MemberID  SERIAL, -- SERIAL is a handy shorthand for
                    -- BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
  LastName  VARCHAR(255) NOT NULL,
  FirstName VARCHAR(255) NOT NULL,
  City      VARCHAR(255) NOT NULL,
  Address   VARCHAR(255),
  Zip       INT NOT NULL
);

CREATE TABLE Devices ( 
  DeviceID   SERIAL,
  MemberID   BIGINT UNSIGNED NOT NULL,
  CellNumber INT NOT NULL,
  FOREIGN KEY (MemberID) REFERENCES Customers (MemberID)
    -- This foreign key constraint will enforce the requirement that a record
    -- with the given MemberID exists in the Customers table
);

然后查询已连接的组合:

SELECT * FROM Customers JOIN Devices USING (MemberID)

此查询将返回每个相关客户 - 设备组合的记录。因此,如果客户有多个设备,则结果集中将有多个该客户的记录。通常这正是您想要的,您的应用程序可以根据需要处理重复项,但为了简洁起见,您可能希望分组结果,以便每个客户只有一条记录 - 例如:< / p>

SELECT   Customers.*, GROUP_CONCAT(Devices.CellNumber)
FROM     Customers JOIN Devices USING (MemberID)
GROUP BY MemberID