MySQL ERROR 1005: невозможно создать таблицу (номер ошибки: 150) - PullRequest
0 голосов
/ 01 июня 2019

Я новичок в MySQL, я не понимаю свою ошибку проблема с внешним ключом "membre" и "club".

CREATE TABLE club(
    id INT PRIMARY KEY AUTO_INCREMENT,
    nom VARCHAR(255) UNIQUE NOT NULL,
    INDEX club_nom_index (nom),
    adresse_id INT NOT NULL,
    nom_du_responsable VARCHAR(255) NULL,

    FOREIGN KEY club_adresse_id_fk (adresse_id) REFERENCES adresse(id)
);

CREATE TABLE membre(
    id INT PRIMARY KEY AUTO_INCREMENT,
    nom VARCHAR(255) NOT NULL,
    prénom VARCHAR(255) NOT NULL,
    adresse_id INT NOT NULL,
    club_id INT NOT NULL,
    rang_qualification INT NOT NULL,
    numéro_téléphone VARCHAR(255) NULL,
    courriel VARCHAR(255) UNIQUE NULL,
    INDEX membre_courriel_index (courriel),
    nb_parties_gagnées INT NOT NULL,
    nb_parties_perdues INT NOT NULL,
    nb_parties_nulles INT NOT NULL,

    FOREIGN KEY membre_adresse_id_fk (adresse_id) REFERENCES adresse(id),
    FOREIGN KEY membre_club_id_fk (club_id) REFERENCES club(id),
    FOREIGN KEY membre_rang_qualification_fk (rang_qualification) REFERENCES rang(qualification),

    INDEX nom_prénom_membre_index (nom, prénom),
    CONSTRAINT parties_gagnées_chk CHECK (nb_parties_gagnées >= 0),
    CONSTRAINT parties_perdues_chk CHECK (nb_parties_perdues >= 0),
    CONSTRAINT parties_nulles_chk CHECK(nb_parties_nulles >= 0)
);

CREATE TABLE tournoi(
    id INT PRIMARY KEY AUTO_INCREMENT,
    nom VARCHAR(255) NOT NULL,
    INDEX tournoi_nom_index (nom),
    club_id INT NOT NULL,
    date_début DATE NOT NULL,
    date_fin DATE NOT NULL,

    FOREIGN KEY tournoi_club_id_fk (club_id) REFERENCES club(id),

    CONSTRAINT nom_date_unq UNIQUE (nom, date_début)
);

CREATE TABLE partie(
    id INT PRIMARY KEY AUTO_INCREMENT,
    membre1_id INT NOT NULL,
    membre2_id INT NOT NULL,
    résultat INT NULL,
    date_début DATE NULL,
    heure_début TIME NULL,
    id_tournoi INT NOT NULL,

    FOREIGN KEY partie_membre1_id_fk (membre1_id) REFERENCES membre(id),
        FOREIGN KEY partie_membre2_id_fk (membre2_id) REFERENCES membre(id),
    FOREIGN KEY partie_tournoi_id_fk (id_tournoi) REFERENCES tournoi(id),

    INDEX membres_index(membre1_id, membre2_id),
    CONSTRAINT résultat_chk CHECK (résultat >= 0 AND résultat <= 2),
    CONSTRAINT membres_unq UNIQUE (membre1_id, membre2_id),
    CONSTRAINT date_heure_unq UNIQUE (date_début, heure_début)
);

CREATE TABLE adresse(
    id INT PRIMARY KEY AUTO_INCREMENT,
    adresse VARCHAR(255) NOT NULL,
    rue VARCHAR(255) NOT NULL,
    ville VARCHAR(255) NOT NULL,
    code_postal CHAR(6) NULL,
    INDEX adresse_code_index (code_postal),
    province_état CHAR(3) NULL,
    pays CHAR(2) NOT NULL,

    CONSTRAINT code_postal_chk CHECK (code_postal REGEXP '^[A-Z] 
        [[:digit:]][A-Z][[:digit:]][A-Z][[:digit:]]$')
);

CREATE TABLE rang(
    qualification INT PRIMARY KEY AUTO_INCREMENT,
    description VARCHAR(255) UNIQUE NULL        
);

Я ожидал, что программа запустится, но она продолжает сообщать мне, что существует проблема с внешним ключом в "membre" и "club".

1 Ответ

0 голосов
/ 01 июня 2019

Вы должны изменить порядок операторов создания.Первая таблица rang и вторая таблица adresse, потому что другие таблицы имеют ссылки на эти таблицы:

CREATE TABLE rang(
    qualification INT PRIMARY KEY AUTO_INCREMENT,
    description VARCHAR(255) UNIQUE NULL        
);

CREATE TABLE adresse(
    id INT PRIMARY KEY AUTO_INCREMENT,
    adresse VARCHAR(255) NOT NULL,
    rue VARCHAR(255) NOT NULL,
    ville VARCHAR(255) NOT NULL,
    code_postal CHAR(6) NULL,
    INDEX adresse_code_index (code_postal),
    province_état CHAR(3) NULL,
    pays CHAR(2) NOT NULL,

    CONSTRAINT code_postal_chk CHECK (code_postal REGEXP '^[A-Z] 
        [[:digit:]][A-Z][[:digit:]][A-Z][[:digit:]]$')
);

CREATE TABLE club(
    id INT PRIMARY KEY AUTO_INCREMENT,
    nom VARCHAR(255) UNIQUE NOT NULL,
    INDEX club_nom_index (nom),
    adresse_id INT NOT NULL,
    nom_du_responsable VARCHAR(255) NULL,

    FOREIGN KEY club_adresse_id_fk (adresse_id) REFERENCES adresse(id)
);

CREATE TABLE membre(
    id INT PRIMARY KEY AUTO_INCREMENT,
    nom VARCHAR(255) NOT NULL,
    prénom VARCHAR(255) NOT NULL,
    adresse_id INT NOT NULL,
    club_id INT NOT NULL,
    rang_qualification INT NOT NULL,
    numéro_téléphone VARCHAR(255) NULL,
    courriel VARCHAR(255) UNIQUE NULL,
    INDEX membre_courriel_index (courriel),
    nb_parties_gagnées INT NOT NULL,
    nb_parties_perdues INT NOT NULL,
    nb_parties_nulles INT NOT NULL,

    FOREIGN KEY membre_adresse_id_fk (adresse_id) REFERENCES adresse(id),
    FOREIGN KEY membre_club_id_fk (club_id) REFERENCES club(id),
    FOREIGN KEY membre_rang_qualification_fk (rang_qualification) REFERENCES rang(qualification),

    INDEX nom_prénom_membre_index (nom, prénom),
    CONSTRAINT parties_gagnées_chk CHECK (nb_parties_gagnées >= 0),
    CONSTRAINT parties_perdues_chk CHECK (nb_parties_perdues >= 0),
    CONSTRAINT parties_nulles_chk CHECK(nb_parties_nulles >= 0)
);

CREATE TABLE tournoi(
    id INT PRIMARY KEY AUTO_INCREMENT,
    nom VARCHAR(255) NOT NULL,
    INDEX tournoi_nom_index (nom),
    club_id INT NOT NULL,
    date_début DATE NOT NULL,
    date_fin DATE NOT NULL,

    FOREIGN KEY tournoi_club_id_fk (club_id) REFERENCES club(id),

    CONSTRAINT nom_date_unq UNIQUE (nom, date_début)
);

CREATE TABLE partie(
    id INT PRIMARY KEY AUTO_INCREMENT,
    membre1_id INT NOT NULL,
    membre2_id INT NOT NULL,
    résultat INT NULL,
    date_début DATE NULL,
    heure_début TIME NULL,
    id_tournoi INT NOT NULL,

    FOREIGN KEY partie_membre1_id_fk (membre1_id) REFERENCES membre(id),
        FOREIGN KEY partie_membre2_id_fk (membre2_id) REFERENCES membre(id),
    FOREIGN KEY partie_tournoi_id_fk (id_tournoi) REFERENCES tournoi(id),

    INDEX membres_index(membre1_id, membre2_id),
    CONSTRAINT résultat_chk CHECK (résultat >= 0 AND résultat <= 2),
    CONSTRAINT membres_unq UNIQUE (membre1_id, membre2_id),
    CONSTRAINT date_heure_unq UNIQUE (date_début, heure_début)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...