【问题标题】:ERROR 1452 (23000)错误 1452 (23000)
【发布时间】:2015-05-03 01:47:13
【问题描述】:

我的脚本出现此错误:

ERROR 1452 (23000):无法添加或更新子行:外键 约束失败(hbm248_BucherFilms1.films, CONSTRAINT films_ibfk_1 外键 (country) 引用 countries (country))

我想使用 INNODB,但不明白是什么导致了该错误。我所有的外键都排成一行。什么是films_ibfk_1?

这是脚本。

谢谢!

-- create the countries table
DROP TABLE IF EXISTS countries;

CREATE TABLE countries (
    country varchar (50) NOT NULL,
    PRIMARY KEY(country))
    ENGINE = INNODB;

    LOAD DATA LOCAL INFILE "Countries.csv"
    INTO TABLE countries
    FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    IGNORE 1 LINES;

-- create the film_stock table
DROP TABLE IF EXISTS film_stock;

CREATE TABLE film_stock (
    stock varchar (10) NOT NULL,
    PRIMARY KEY(stock))
    ENGINE = INNODB;

    LOAD DATA LOCAL INFILE "FilmStock.csv"
    INTO TABLE film_stock
    FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    IGNORE 1 LINES;

-- create the film_gauge table
DROP TABLE IF EXISTS film_gauge;

CREATE TABLE film_gauge (
    gauge varchar (10) NOT NULL,
    PRIMARY KEY(gauge))
    ENGINE = INNODB;

    LOAD DATA LOCAL INFILE "FilmGauge.csv"
    INTO TABLE film_gauge
    FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    IGNORE 1 LINES;

-- create the bw_or_color table
DROP TABLE IF EXISTS bw_or_color;

CREATE TABLE bw_or_color (
    bw_color varchar (10) NOT NULL,
    PRIMARY KEY(bw_color))
    ENGINE = INNODB;

    LOAD DATA LOCAL INFILE "BW_color.csv"
    INTO TABLE bw_or_color
    FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    IGNORE 1 LINES;

-- create the crew_roles table
DROP TABLE IF EXISTS roles;

CREATE TABLE crew_roles (
    roles varchar (15) NOT NULL,
    PRIMARY KEY(roles))
    ENGINE = INNODB;

    LOAD DATA LOCAL INFILE "Roles.csv"
    INTO TABLE crew_roles
    FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    IGNORE 1 LINES;

-- create the people table
DROP TABLE IF EXISTS people;

CREATE TABLE people (
    full_name varchar (50) NOT NULL,
    people_ID varchar (15) NOT NULL,
    date_of_birth DATE,
    date_of_death DATE,
    PRIMARY KEY(people_ID))
    ENGINE = INNODB;

    LOAD DATA LOCAL INFILE "People.csv"
    INTO TABLE people
    FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    IGNORE 1 LINES;    

-- create the cast_members table
DROP TABLE IF EXISTS cast_members;

CREATE TABLE cast_members (
    cast_ID int AUTO_INCREMENT,
    title varchar (50) NOT NULL,
    full_name varchar (50) NOT NULL,
    roles varchar (15) NOT NULL,
    PRIMARY KEY(cast_ID),
    FOREIGN KEY(title) REFERENCES films (title),
    FOREIGN KEY(full_name) REFERENCES people (full_name),
    FOREIGN KEY(roles) REFERENCES crew_roles (roles))
    ENGINE = INNODB;

    LOAD DATA LOCAL INFILE "CastMembers.csv"
    INTO TABLE cast_members
    FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    IGNORE 1 LINES;


-- create the films table
DROP TABLE IF EXISTS films;

CREATE TABLE films (
    title varchar (100) NOT NULL,
    alternate_title varchar (50) NULL,
    year_of_release varchar (15) NULL,  
    country varchar (50) NULL,
    running_time_minutes int (10) NULL,
    footage_lenght_feet int (10) NULL,
    stock varchar (10) NULL,
    gauge varchar (10) NULL,
    bw_color varchar (10) NULL,
    notes varchar (255) NULL,
    print_publications varchar (255) NULL,
    existent_print varchar (255) NULL,
    url_1 varchar (100) NULL,
    url_2 varchar (100) NULL,
    url_3 varchar (100) NULL,
    PRIMARY KEY(title),
    FOREIGN KEY(country) REFERENCES countries (country),
    FOREIGN KEY(stock) REFERENCES film_stock (stock),
    FOREIGN KEY(bw_color) REFERENCES bw_or_color (bw_color),
    FOREIGN KEY(gauge) REFERENCES film_gauge (gauge))
    ENGINE = INNODB;

    LOAD DATA LOCAL INFILE "Films.csv"
    INTO TABLE films
    FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    IGNORE 1 LINES;

非常感谢任何帮助!

【问题讨论】:

  • 可能是这一行:FOREIGN KEY(film_gauge) REFERENCES film_gauge (film_gauge));
  • 我试过了,得到:错误 1452 (23000): 无法添加或更新子行:外键约束失败 (hbm248_BucherFilms1.films, CONSTRAINT films_ibfk_1 FOREIGN KEY (@ 987654331@) 参考countries (country))
  • 外键类型必须匹配。一个是 varchar(50),另一个是 varchar(20)。
  • 我解决了这个问题,但没有解决问题。同样的错误。
  • film_gauge 表中有一个film_gauge 列,然后有一个名为film_gauge 的外键引用film_gauge(film_gauge),在我看来是一个非常糟糕的主意,但也许这就是我。这有点像乔治·福尔曼给他所有的男孩起名George;当您想知道当您阅读 George is a bad boy today 时所指的是哪一个时,这可能有点令人困惑。

标签: mysql foreign-keys innodb


【解决方案1】:

计划 A:以正确的顺序加载表格。 (在需要country的任何表之前加载Countries。等)

计划 B:禁用键 ...执行加载 ...启用键

【讨论】:

  • 那么,首先你加载了countries?然后,你加载了films,但它出错了? country 是什么电影试图参考?是country 中的countries 吗?
【解决方案2】:

“ENGINE = INNODB”不是 create table 语句的一部分。删除这两个表的第一个分号。

CREATE TABLE cast_members (
cast_ID int AUTO_INCREMENT,
title varchar (50) NOT NULL,
full_name varchar (50) NOT NULL,
roles varchar (15) NOT NULL,
PRIMARY KEY(cast_ID),
FOREIGN KEY(title) REFERENCES films (title),
FOREIGN KEY(full_name) REFERENCES people (full_name),
FOREIGN KEY(roles) REFERENCES roles (roles)); <-- this one
ENGINE = INNODB;

【讨论】:

  • 我试过了,得到:ERROR 1005 (HY000): Can't create table 'hbm248_BucherFilms1.cast_members' (errno: 150)
  • 肯·怀特是正确的。在此处阅读首要原因:dev.mysql.com/doc/refman/5.5/en/innodb-error-codes.html
  • 我已修复但仍有:错误 1452 (23000): 无法添加或更新子行:外键约束失败 (hbm248_BucherFilms1.films, CONSTRAINT films_ibfk_1 FOREIGN KEY ( country) 参考资料 countries (country))
  • films.csv 中country 的值在表格国家/地区可能不存在。
  • 不是这样,除了一个空白单元格。但我将电影表中的国家/地区设置为 NULL,所以我认为这不是问题。
猜你喜欢
  • 2018-06-12
  • 1970-01-01
  • 2015-11-27
  • 2013-08-22
  • 1970-01-01
  • 2021-07-23
  • 2018-02-15
  • 1970-01-01
  • 2013-11-15
相关资源
最近更新 更多