【问题标题】:SQL Server - Invalid TableSQL Server - 无效表
【发布时间】:2018-03-19 15:55:41
【问题描述】:

我对 SQL 还很陌生,我不明白为什么在建立外键时收到错误消息,因为我收到错误消息说目标表无效。

下面是 SQL 代码,任何关于如何修复的建议都会很棒! :)

出现关于 tblFilms 和 tblCinemaScreens 的错误。

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

【问题讨论】:

  • 您在tblFilms 和tblCinemaScreens 之间有循环引用。我不确定这是否可行。
  • 只有存在的表才能引用,先创建表,再引用。
  • 从tblFilms 中删除CinemaScreenID 列,因为一部电影可以在多个屏幕上播放。然后将tblFilms 移动到查询的顶部,你应该没问题

标签: sql sql-server create-table


【解决方案1】:

电影屏幕表不需要电影 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

【讨论】:

  • 我很确定 tblCinemaScreens 需要 filmId 但 tblFilms 不需要 CinemaScreenID
  • cienma 屏幕表有座位数等数据。它的信息不需要为每部电影重复。说电影 A 在屏幕 B 中放映比屏幕 A 在放映电影 B 更有意义,并且对每部电影都重复这一点。否则,您最终会在每个表中使用 200 行,而不是 200 部电影和 X 屏幕。
  • 阅读您的多个屏幕以获得相同的电影评论,您的观点很好。没想到。最好的解决方案 IMO 将是两者之间的链接表:)
【解决方案2】:

您正试图在创建表之前为其创建外键。注释掉 create table 语句中出现错误的行并创建表。创建表后,创建您需要的缺少的外键,如下所示:

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)

【讨论】:

    【解决方案3】:

    答案是他们不应该有直接的关系
    一部电影在 0 个或多个屏幕上放映

    你需要一个连接表

    rblFilmCinema  
    filmID   fk to tblFilms
    screenID fk to tblCinemaScreens  
    
    composite PK on filmID, screenID
    

    【讨论】:

      【解决方案4】:

      我会改变一些架构,给自己更多的灵活性。我会假设一部电影可以在多个电影院屏幕上,所以我会从tblFilms 中取出CinemaScreenID 并删除外键。您还可以从tblBookings 中删除FilmID,因为您已经拥有CinemaScreenID,它已经拥有FilmID.. 另一件要考虑的事情可能是在同一个CinemaScreen 上拥有多部电影,这将是另一个名为@987654328 的表格@ 并且您会将 CinemaScreenFilmID 放在 tblBookings 上

      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(首选)

      CREATE TABLE tblCustomer (
          CustomerID int,
          ...
          CONSTRAINT PK_tblCustomer PRIMARY KEY CLUSTERED (CustomerID)
          )
          GO
      
      CREATE TABLE tblFilms (
          FilmID int,
          ...
          CONSTRAINT PK_tblFilms PRIMARY KEY CLUSTERED (FilmID),
          )
          GO
      
      CREATE TABLE tblCinemaScreens (
          CinemaScreenID int, 
          ...
          CONSTRAINT PK_tblCinemaScreens PRIMARY KEY CLUSTERED (CinemaScreenID)
          )
          GO
      
      
      CREATE TABLE tblCinemaScreenFilms (
          CinemaScreenFilmID int,
          CinemaScreenID int, 
          FilmID int
          CONSTRAINT PK_tblCinemaScreenFilms PRIMARY KEY CLUSTERED (CinemaScreenFilmID),
          CONSTRAINT FK_FilmID FOREIGN KEY (FilmID) REFERENCES tblFilms(FilmID),
          CONSTRAINT FK_CinemaScreenID FOREIGN KEY (FilmID) REFERENCES tblCinemaScreens(CinemaScreenID)
          )
          GO
      
      CREATE TABLE tblBookings (
          BookingID int,
          CustomerID int,
          CinemaScreenFilmID int,
          ...
          CONSTRAINT PK_tblBookings PRIMARY KEY CLUSTERED (BookingID),
          CONSTRAINT FK_CustomerID FOREIGN KEY (CustomerID) REFERENCES tblCustomer(CustomerID),
          CONSTRAINT FK_CinemaScreenFilmID FOREIGN KEY (CinemaScreenFilmID) REFERENCES tblCinemaScreenFilms(CinemaScreenFilmID)
          )
          GO
      

      【讨论】:

        【解决方案5】:

        您正在创建一个表 - tblFilms - 并在创建第二个表之前将外键添加到 tblCinemaScreens。

        作为帮助,我通常会创建所有表,然后创建任何外键关系和其他约束。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多