SQL Server-无效表

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

我对SQL相当陌生,我不明白为什么在建立外键时会收到一个错误,因为我收到一个错误,说目标表无效

下面是SQL代码,任何关于如何修复的建议都会非常棒

出现有关tblFilms和TBLCIEMA屏幕的错误

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