mysql - 未找到 SQL 完整性约束父键

标签 mysql sql foreign-keys constraints

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

我可以为前两个表插入数据,即 vod_actor 和 vod_classification,但是当尝试添加第三个/第四个表数据时,我收到以下错误: ORA-02291: 违反了完整性约束 (SYSTEM.VOD_FILM_CLASS_FK) - 父级

我不明白为什么,因为 vod_film 的 FK 是 vod_classification 的 PK,它已经填充了数据。

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

     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');

最佳答案

所以在这种情况下,我认为 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)

似乎是问题所在。 char(3) <> char(4) 使它们相同。可能是 3 到 4。

如果我记得右字符填充空格到末尾,那么“U”永远不会等于“U”U w/2 个空格表示 3 个字符,而 U 包含 3 个空格表示 4 个字符。我更喜欢 varchar 没有空格填充的原因之一。为什么在这里选择 char?

关于mysql - 未找到 SQL 完整性约束父键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48910803/

相关文章:

php - 如何使用 php 按学年和学期显示表格?

MySQL 插入和选择

shell - 使用 Django shell 实例化具有外键属性的对象

Django:使用 to_field 和 ModelChoiceForm 使用外键保存模型表单

mysql - 如何在 DBIx::Class 的 SELECT 部分使用子查询?

php - MySQL需要设置外键吗?

PHP 表单插入 Db 内的特定表

php - 与参数相符的显示

android - 在 TableView 中显示结果集

mysql - 如何在不使用标准 mod 方法的情况下返回每第 n 行