2014-04-18 99 views
0

作为一个练习,我正在构建我的第一个SQL数据库。我试图为我的数据库中的所有表创建语句。我想知道是否有任何外键可以被删除?MySQL加入多个表+ FK

我的第二个问题是如何对这个数据库进行查询,该数据库在4个或更多的表上使用连接。

任何答案将appriciated!

CREATE TABLE CLUB(
cl_id  INT  PRIMARY KEY  NOT NULL, 
naam  TEXT     NOT NULL, 
adres  VARCHAR(200)    NOT NULL, 
dtm_oprichta TEXT     NOT NULL 
); 


CREATE TABLE STADION(
sta_id  INT  PRIMARY KEY  NOT NULL, 
cl_id  INT  REFERENCES CLUB(cl_id), 
naam  TEXT     NOT NULL, 
adres  VARCHAR(200)    NOT NULL, 
capaciteit INT     NOT NULL, 
dtm_bouw TEXT     NOT NULL 
); 

CREATE TABLE TECHNISCHDIRECTEUR(
td_id  INT  PRIMARY KEY  NOT NULL, 
cl_id  INT  REFERENCES CLUB(cl_id), 
naam  TEXT     NOT NULL, 
adres  VARCHAR(200)    NOT NULL, 
salaris  REAL     NOT NULL, 
nationaliteit TEXT     NOT NULL, 
geslacht CHAR     NOT NULL, 
dtm_geboorte TEXT     NOT NULL 
); 

CREATE TABLE FINANCIEELDIRECTEUR(
fd_id  INT  PRIMARY KEY  NOT NULL, 
cl_id  INT  REFERENCES CLUB(cl_id), 
naam  TEXT     NOT NULL, 
adres  VARCHAR(200)    NOT NULL, 
salaris  REAL     NOT NULL, 
nationaliteit TEXT     NOT NULL, 
geslacht CHAR     NOT NULL, 
dtm_geboorte TEXT     NOT NULL 
); 


CREATE TABLE HOOFDTRAINER(
ht_id  INT  PRIMARY KEY  NOT NULL, 
cl_id  INT  REFERENCES CLUB(cl_id), 
td_id  INT  REFERENCES TECHNISCHDIRECTEUR(td_id), 
naam  TEXT     NOT NULL, 
adres  VARCHAR(200)    NOT NULL, 
salaris  REAL     NOT NULL, 
nationaliteit TEXT     NOT NULL, 
geslacht CHAR     NOT NULL, 
dtm_geboorte TEXT     NOT NULL 
); 


CREATE TABLE ASSISTENTTRAINER(
at_id  INT  PRIMARY KEY  NOT NULL, 
cl_id  INT  REFERENCES CLUB(cl_id), 
ht_id  INT  REFERENCES HOOFDTRAINER(ht_id), 
naam  TEXT     NOT NULL, 
adres  VARCHAR(200)    NOT NULL, 
salaris  REAL     NOT NULL, 
nationaliteit TEXT     NOT NULL, 
geslacht CHAR     NOT NULL, 
dtm_geboorte TEXT     NOT NULL 
); 

CREATE TABLE SPELER(
sp_id  INT  PRIMARY KEY  NOT NULL, 
cl_id  INT  REFERENCES CLUB(cl_id), 
ht_id  INT  REFERENCES HOOFDTRAINER(ht_id), 
naam  TEXT     NOT NULL, 
adres  VARCHAR(200)    NOT NULL, 
salaris  REAL     NOT NULL, 
nationaliteit TEXT     NOT NULL, 
geslacht CHAR     NOT NULL, 
dtm_geboorte TEXT     NOT NULL, 
positie  TEXT     NOT NULL, 
rugnummer INT     NOT NULL 
); 
+0

你想查询返回什么? – Barmar

+0

如果需要,您可以删除所有外键,完全取决于您是否希望数据库强制实施表间的一致性。 – Barmar

+0

@Barmar非常感谢您的回答!如果你明白我的意思,我希望表格尽可能地相互链接。例如,斯佩勒已经链接到俱乐部沟槽Hoofdtrainer权利?所以我可以在Speler中删除club_id PK吗? 对于查询它并不重要,我只需要找到一个在4个或更多表上使用连接的查询。 – user259191

回答

0

1)您可以删除外键。看着你的表名:

STADION: cl_id  - Identifies a club associated to a stadium. 
TECHNISCHDIRECTEUR cl_id  - Identifies a club associated to a Technical Director 
FINANCIEELDIRECTEUR cl_id  - Identifies a club associated to a Financial Director 

如果你删除任何的外键,你将失去以确定它们属于哪个俱乐部的能力!所以,我会说,保持他们。

2)所以这里是一个连接所有四个表的示例查询。这个例子显示了每个俱乐部的体育场,技术总监和财务总监,如果他们有他们的话!假设是每个俱乐部只有一个体育场\技术总监\财务总监。如果他们有多一个,你会看到俱乐部行重复(但正如我所说,这只是一个简单的例子)。

Select c.cl_id as ClubId, c.naam as Club, td.naam as TechnicalDirector, fd.naam as FinancialDirector 
From Club c 
left join STADION s on s.cl_id = c.cl_id 
left join TECHNISCHDIRECTEUR td on td.cl_id = c.cl_id 
left join FINANCIEELDIRECTEUR fd on fd.cl_id = c.cl_id 
+0

最好的沙林, 非常感谢你的非常有帮助的评论。我现在了解了多个表上的连接是如何工作的,并且设法创建了更多的连接。你可能也可以建议在这个数据库上使用外连接进行查询吗? – user259191

+0

'左连接'是'左外连接'的缩写!随意将帖子标记为已回答您的问题。如果有! – sarin

+0

非常感谢萨林再次回复。我的练习是为我发布的数据库编写两个查询。一个必须是使用4个或更多表的“连接”。另一个必须是使用外连接的查询。你的第一个答案包括哪一个? – user259191