代码之家  ›  专栏  ›  技术社区  ›  Hgrammer

未找到sql完整性约束父项

  •  1
  • Hgrammer  · 技术社区  · 8 年前

    我正在尝试做一些非常简单的事情,创建并插入4个表及其数据。我花了几个小时在网上研究完整性约束,并尝试了几个IDE以防出现错误,但似乎什么都不起作用。代码如下所示(按顺序执行)。

    我可以插入前两个表的数据,即vod\U actor和vod\U classification,但在尝试添加第三/第四个表数据时,我会遇到以下错误: ORA-02291:违反完整性约束(SYSTEM.VOD\u FILM\u CLASS\u FK)-父级

    我不明白为什么,因为FK for vod\u电影是PK for vod\u分类,它已经填充了数据。

    任何帮助都将不胜感激。我是初学者,请记住这一点。谢谢

         CREATE TABLE vod_actor (
         dbActorId      CHAR(4) NOT NULL,
         dbFirstname    VARCHAR2(50) NOT NULL,
         dbLastname     VARCHAR2(50) NOT NULL,
         dbDateOfBirth  DATE,
         dbNationality  VARCHAR2(30),
         dbBiography    CLOB,
         CONSTRAINT vod_actor_PK PRIMARY KEY (dbActorId)
         );
    
         CREATE TABLE vod_classification (
         dbClassId  CHAR(4) NOT NULL,
         dbDescription  VARCHAR(250) NOT NULL,
         CONSTRAINT vod_classification_PK PRIMARY KEY (dbClassId)
         );
    
         CREATE TABLE vod_film (
         dbFilmId   CHAR(4) NOT NULL,
         dbTitle        VARCHAR2(100) NOT NULL,
         dbDirector_firstname   VARCHAR2(50) NOT NULL,
         dbDirector_lastname    VARCHAR2(50) NOT NULL,
         dbGenre        VARCHAR2(20),
         dbUK_release_date  DATE,
         dbFilename     VARCHAR2(50),
         dbRuntime  NUMBER(4),
         dbClass        CHAR(3),
         CONSTRAINT vod_film_PK PRIMARY KEY (dbFIlmId),
         CONSTRAINT vod_film_class_FK FOREIGN KEY (dbClass) REFERENCES
         vod_classification (dbClassId) ON DELETE SET NULL
         );
    
         CREATE TABLE vod_role (
         dbFilmId           Char(4) NOT NULL,
         dbActorId          CHAR(4) NOT NULL,
         dbCharacterName    VARCHAR2(25) NOT NULL,
         dbFirstAppearance  NUMBER(6),
         dbDescription      CLOB,
         CONSTRAINT vod_role_PK PRIMARY KEY (dbFilmId, dbActorId, dbCharacterName),
         CONSTRAINT vod_role_film_FK FOREIGN KEY (dbFilmId) REFERENCES vod_film (dbFilmId)
         ON DELETE CASCADE,
         CONSTRAINT vod_role_actor_FK FOREIGN KEY (dbActorId) REFERENCES         vod_actor (dbActorId)
         ON DELETE CASCADE
         );
    
         //Insert into vod_actor & vod_classification works fine
    

    执行下面的代码会出现错误:

         INSERT INTO vod_film VALUES ('1', 'Toy Story 3', 'Lee', 'Unkrich', 'Comedy', '19-JUL-2010', 'ToyStory3.mpg', '103', 'U');
    
         INSERT INTO vod_film VALUES ('2', 'Lord of the Rings: Fellowship of the ring', 'Peter', 'Jackson', 'Fantasy', '19-DEC-2001', 'Fellowship.mpg', '178', '12');
    
         INSERT INTO vod_film VALUES ('3', 'Lord of the Rings: Two Towers', 'Peter', 'Jackson', 'Fantasy', '18-DEC-2002', 'TwoTowers.mpg', '179', '12');
    
         INSERT INTO vod_film VALUES ('4', 'Lord of the Rings: Return of the King', 'Peter', 'Jackson', 'Fantasy', '17-DEC-2003', 'KingReturns.mpg', '201', '12');
    
         INSERT INTO vod_film VALUES ('5', 'Face/Off', 'John', 'Woo', 'Action', '7-NOV-1997', 'FaceOff.mpg', '138', '18');
    
         INSERT INTO vod_film VALUES ('6', 'The Nutty Professor', 'Tom', 'Shadyac', 'Comedy', '4-OCT-1996', 'NuttyProf.mpg', '95', '12');
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   xQbert    8 年前

    因此,在这种情况下,PK FK字段的字符长度不同是问题所在。

    CREATE TABLE vod_classification (
         dbClassId  CHAR(4) NOT NULL,
         ....
    
    CREATE TABLE vod_film (
    ...
         dbClass        CHAR(3),
    

    给定约束条件

     CONSTRAINT vod_film_class_FK FOREIGN KEY (dbClass) REFERENCES
         vod_classification (dbClassId)
    

    似乎是问题所在。字符(3)<&燃气轮机;char(4)使两者相同。可能是3到4。

    如果我记得右字符在末尾加空格,那么“U”永远不会等于“U”,其中3个字符加2个空格,而U中4个字符加3个空格。我喜欢varchar的原因之一是不填充空格。为什么选择char?