MySQL错误1005:Can';t创建表(错误号:150)
我是mysql的初学者,我不明白我的错误 “membre”和“club”的外键有问题MySQL错误1005:Can';t创建表(错误号:150),mysql,foreign-keys,Mysql,Foreign Keys,我是mysql的初学者,我不明白我的错误 “membre”和“club”的外键有问题 CREATE TABLE club( id INT主键自动递增, nom VARCHAR(255)唯一值不为空, 指数俱乐部(nom)指数(nom),, 地址id INT不为空, nom_du_responsible VARCHAR(255)NULL, 外键俱乐部地址id fk(地址id)参考地址(id) ); 创建表membre( id INT主键自动递增, nom VARCHAR(255)不为空, prén
CREATE TABLE club(
id INT主键自动递增,
nom VARCHAR(255)唯一值不为空,
指数俱乐部(nom)指数(nom),,
地址id INT不为空,
nom_du_responsible VARCHAR(255)NULL,
外键俱乐部地址id fk(地址id)参考地址(id)
);
创建表membre(
id INT主键自动递增,
nom VARCHAR(255)不为空,
prénom VARCHAR(255)不为空,
地址id INT不为空,
club_id INT不为空,
rang_限定INT不为空,
numéro_étéléphone VARCHAR(255)NULL,
courriel VARCHAR(255)唯一NULL,
索引membre_courriel_索引(courriel),
注意:双方的数据不为空,
注意:双方的义务不为空,
注意:当事方为NULL INT NOT NULL,
外键membre_address_id_fk(address_id)引用了address(id),
外键membre_club_id_fk(club_id)参考俱乐部(id),
外键记忆范围限定fk(范围限定)参考范围限定,
指数名称(nom,prénom),
约束方检查(注意方检查>=0),
约束方费用检查(nb方费用>=0),
约束参与方为空检查(注意:参与方为空>=0)
);
创建表tournoi(
id INT主键自动递增,
nom VARCHAR(255)不为空,
指数tournoi_nom_指数(nom),
club_id INT不为空,
日期,但日期不为空,
日期\财务日期不为空,
外键tournoi_俱乐部id_fk(俱乐部id)参考俱乐部(id),
约束nom_date_unq UNIQUE(nom,date_deébut)
);
创建表partie(
id INT主键自动递增,
membre1_id INT不为空,
membre2_id INT不为空,
résultat INT NULL,
日期但日期为空,
但时间是空的,
id_tournoi INT不为空,
外键partie_membre1_id_fk(membre1_id)引用membre(id),
外键partie_membre2_id_fk(membre2_id)引用membre(id),
外键partie_tournoi_id_fk(id_tournoi)引用tournoi(id),
索引membres_INDEX(membre1_id,membre2_id),
约束résultat_chk CHECK(résultat>=0和résultat必须更改create语句的顺序。
第一个表范围
和第二个表地址
,因为其他表都引用了这些表:
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)
);
创建表范围(
鉴定INT主键自动增量,
description VARCHAR(255)唯一NULL
);
创建表地址(
id INT主键自动递增,
adresse VARCHAR(255)不为空,
rue VARCHAR(255)不为空,
ville VARCHAR(255)不为空,
代码\邮政字符(6)空,
索引地址代码索引(邮政编码),
省(3)空,
字符(2)不为空,
约束代码邮政chk检查(代码邮政REGEXP'^[A-Z]
[[:数位:][A-Z][[:数位:][A-Z][[:数位:][]$”)
);
创建桌面俱乐部(
id INT主键自动递增,
nom VARCHAR(255)唯一值不为空,
指数俱乐部(nom)指数(nom),,
地址id INT不为空,
nom_du_responsible VARCHAR(255)NULL,
外键俱乐部地址id fk(地址id)参考地址(id)
);
创建表membre(
id INT主键自动递增,
nom VARCHAR(255)不为空,
prénom VARCHAR(255)不为空,
地址id INT不为空,
club_id INT不为空,
rang_限定INT不为空,
numéro_étéléphone VARCHAR(255)NULL,
courriel VARCHAR(255)唯一NULL,
索引membre_courriel_索引(courriel),
注意:双方的数据不为空,
注意:双方的义务不为空,
注意:当事方为NULL INT NOT NULL,
外键membre_address_id_fk(address_id)引用了address(id),
外键membre_club_id_fk(club_id)参考俱乐部(id),
外键记忆范围限定fk(范围限定)参考范围限定,
指数名称(nom,prénom),
约束方检查(注意方检查>=0),
约束方费用检查(nb方费用>=0),
约束参与方为空检查(注意:参与方为空>=0)
);
创建表tournoi(
id INT主键自动递增,
nom VARCHAR(255)不为空,
指数tournoi_nom_指数(nom),
club_id INT不为空,
日期,但日期不为空,
日期\财务日期不为空,
外键tournoi_俱乐部id_fk(俱乐部id)参考俱乐部(id),
约束nom_date_unq UNIQUE(nom,date_deébut)
);
创建表partie(
id INT主键自动递增,
membre1_id INT不为空,
membre2_id INT不为空,
résultat INT NULL,
日期但日期为空,
但时间是空的,
id_tournoi INT不为空,
外键partie_membre1_id_fk(membre1_id)引用membre(id),
外键partie_membre2_id_fk(membre2_id)引用membre(id),
外键partie_tournoi_id_fk(id_tournoi)引用tournoi(id),
索引membres_INDEX(membre1_id,membre2_id),
约束résultat_chk检查(résultat>=0且résultat您无法引用尚未创建的表;请将adrese
和rang
移动到脚本的开头。您能否…提供引用这些外键的实际错误?您必须先创建adrese
表,然后才能在俱乐部中为其创建外键
和membre
表。更改运行CreateSO的顺序只需将Adrese
表移到顶部即可。仅供参考,检查
约束在MySQL 8.0之前被忽略。
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)
);