SQL Server-无效表
我对SQL相当陌生,我不明白为什么在建立外键时会收到一个错误,因为我收到一个错误,说目标表无效 下面是SQL代码,任何关于如何修复的建议都会非常棒 出现有关tblFilms和TBLCIEMA屏幕的错误SQL Server-无效表,sql,sql-server,create-table,Sql,Sql Server,Create Table,我对SQL相当陌生,我不明白为什么在建立外键时会收到一个错误,因为我收到一个错误,说目标表无效 下面是SQL代码,任何关于如何修复的建议都会非常棒 出现有关tblFilms和TBLCIEMA屏幕的错误 CREATE TABLE tblCustomer ( CustomerID int, CustomerSurname NVARCHAR(25), CustomerForename NVARCHAR(20), CustomerAge int, Customer
CREATE TABLE tblCustomer (
CustomerID int,
CustomerSurname NVARCHAR(25),
CustomerForename NVARCHAR(20),
CustomerAge int,
CustomerPhoneNumber NVARCHAR(12),
CustomerEmailAddress NVARCHAR(100),
CONSTRAINT PK_tblCustomer PRIMARY KEY CLUSTERED (CustomerID)
)
GO
CREATE TABLE tblBookings (
BookingID int,
FilmShowings TIME,
PriceOfFilm MONEY,
DateOfBooking DATE,
FilmID int,
CinemaScreenID int,
CustomerID int,
CONSTRAINT PK_tblBookings PRIMARY KEY CLUSTERED (BookingID),
CONSTRAINT FK_FilmID FOREIGN KEY (FilmID) REFERENCES tblFilms(FilmID),
CONSTRAINT FK_CustomerID FOREIGN KEY (CustomerID) REFERENCES tblCustomer(CustomerID)
)
GO
CREATE TABLE tblFilms (
FilmID int,
FilmName VARCHAR(100),
FilmDuration int,
AgeRating VARCHAR(3),
CriticScore int,
FilmDescription NVARCHAR(300),
FilmGenre NVARCHAR(20),
FilmStartScreeningDate DATE,
FlimEndScreeningDate DATE,
CinemaScreenID int,
CONSTRAINT PK_tblFilms PRIMARY KEY CLUSTERED (FilmID),
CONSTRAINT FK_tblFilms FOREIGN KEY (CinemaScreenID) REFERENCES tblCinemaScreens(CinemaScreenID)
)
GO
CREATE TABLE tblCinemaScreens (
CinemaScreenID int,
CinemaScreenType NVARCHAR(10),
NumberOfSeats int,
FilmID int,
CONSTRAINT PK_tblCinemaScreens PRIMARY KEY CLUSTERED (CinemaScreenID),
CONSTRAINT FK_tblCinemaScreens FOREIGN KEY (FilmID) REFERENCES tblFilms(FilmID)
)
GO
电影屏幕表不需要电影id,您需要在使用FK引用表之前创建这些表
CREATE TABLE tblCinemaScreens (
CinemaScreenID int,
CinemaScreenType NVARCHAR(10),
NumberOfSeats int,
FilmID int,
CONSTRAINT PK_tblCinemaScreens PRIMARY KEY CLUSTERED (CinemaScreenID)
GO
CREATE TABLE tblFilms (
FilmID int,
FilmName VARCHAR(100),
FilmDuration int,
AgeRating VARCHAR(3),
CriticScore int,
FilmDescription NVARCHAR(300),
FilmGenre NVARCHAR(20),
FilmStartScreeningDate DATE,
FlimEndScreeningDate DATE,
CinemaScreenID int,
CONSTRAINT PK_tblFilms PRIMARY KEY CLUSTERED (FilmID),
CONSTRAINT FK_tblFilms FOREIGN KEY (CinemaScreenID) REFERENCES tblCinemaScreens(CinemaScreenID)
)
GO
CREATE TABLE tblCustomer (
CustomerID int,
CustomerSurname NVARCHAR(25),
CustomerForename NVARCHAR(20),
CustomerAge int,
CustomerPhoneNumber NVARCHAR(12),
CustomerEmailAddress NVARCHAR(100),
CONSTRAINT PK_tblCustomer PRIMARY KEY CLUSTERED (CustomerID)
)
GO
CREATE TABLE tblFilms (
FilmID int,
FilmName VARCHAR(100),
FilmDuration int,
AgeRating VARCHAR(3),
CriticScore int,
FilmDescription NVARCHAR(300),
FilmGenre NVARCHAR(20),
FilmStartScreeningDate DATE,
FlimEndScreeningDate DATE,
CinemaScreenID int,
CONSTRAINT PK_tblFilms PRIMARY KEY CLUSTERED (FilmID),
CONSTRAINT FK_tblFilms FOREIGN KEY (CinemaScreenID) REFERENCES tblCinemaScreens(CinemaScreenID)
)
GO
您正在创建一个表tblFilms,并在创建第二个表之前将外键添加到TBLCinema屏幕
作为帮助,我通常创建所有表,然后创建任何外键关系和其他约束。您正在尝试在创建表之前在表上创建外键。注释掉CREATETABLE语句中出现错误的行,然后创建表。创建表后,按如下方式创建缺少的外键:
alter table tblFilms
add CONSTRAINT FK_tblFilms FOREIGN KEY (CinemaScreenID) REFERENCES tblCinemaScreens(CinemaScreenID)
alter table tblBookings
add CONSTRAINT FK_FilmID FOREIGN KEY (FilmID) REFERENCES tblFilms(FilmID)
我会改变一些模式,给自己更多的灵活性。我假设一部电影可以出现在多个影院屏幕上,因此我会从
tblFilms
中取出CinemaScreenID
并删除外键。您还可以从tblBookings
中删除FilmID
,因为您已经有了CinemaScreenID
,它已经有了FilmID
。。另一件需要考虑的事情可能是在同一个<代码>电影底片< /代码>上有多个电影,这将是另一个被称为<代码> TBLCimeMasCurnEngs<代码>的标签,你可以在<代码> TBLBoogss>代码> >
CREATE TABLE tblFilms (
FilmID int,
...
CONSTRAINT PK_tblFilms PRIMARY KEY CLUSTERED (FilmID),
)
GO
CREATE TABLE tblCustomer (
CustomerID int,
...
CONSTRAINT PK_tblCustomer PRIMARY KEY CLUSTERED (CustomerID)
)
GO
CREATE TABLE tblBookings (
BookingID int,
CinemaScreenID int,
CustomerID int,
...
CONSTRAINT PK_tblBookings PRIMARY KEY CLUSTERED (BookingID),
CONSTRAINT FK_CinemaScreenID FOREIGN KEY (CinemaScreenID ) REFERENCES tblCinemaScreens(CinemaScreenID),
CONSTRAINT FK_CustomerID FOREIGN KEY (CustomerID) REFERENCES tblCustomer(CustomerID)
)
GO
CREATE TABLE tblCinemaScreens (
CinemaScreenID int,
FilmID int,
...
CONSTRAINT PK_tblCinemaScreens PRIMARY KEY CLUSTERED (CinemaScreenID),
CONSTRAINT FK_tblCinemaScreens FOREIGN KEY (FilmID) REFERENCES tblFilms(FilmID)
)
GO
选项B(首选)
答案是他们不应该有直接的关系
电影在0个或更多屏幕上放映 您需要一个联接表
rblFilmCinema
filmID fk to tblFilms
screenID fk to tblCinemaScreens
composite PK on filmID, screenID
在
tblFilms
和tblFilms
之间有循环引用。我不确定这是否会起作用。只有存在表时,才能引用该表,首先创建表,然后引用它们。从tblFilms
中删除CinemaScreenID
列,因为一部电影可以在多个屏幕上播放。。然后将tblFilms
移动到查询的顶部,您应该很清楚,tblCinemaScreens需要filmId,但tblFilms不需要CinemaScreenID Cinema screens表有座位数等数据。它的信息不需要在每部电影中重复。说电影A在B屏上放映比说电影A在B屏上放映更有意义,并对每部电影重复这一点。否则,你会在每个表中看到200行,而不是200部电影和X屏。阅读多个屏幕上的同一部电影评论,你的观点是正确的。我没想到。最好的解决方案是在两者之间建立一个链接表:)
rblFilmCinema
filmID fk to tblFilms
screenID fk to tblCinemaScreens
composite PK on filmID, screenID