mysql:无法创建表(errno:150)

ars1skjm  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(420)

mysql:无法创建表(errno:150)
因为这个错误,我不能完成我的数据库。这似乎是在大胆的路线。
建立医院数据库;

create table medico(
CRM INT NOT NULL,
NomeMedico VARCHAR (40) NOT NULL,
NomeDepto VARCHAR (40),
ChefeDepto VARCHAR (40),
Especialidade1 VARCHAR(40),
Especialidade2 VARCHAR (40),
PRIMARY KEY (CRM)
)ENGINE = INNODB;

create table paciente(
Registro INT NOT NULL,
NomePac VARCHAR (40) NOT NULL,
DataNascimento DATE NOT NULL,
SexoPac ENUM ('M','F') NOT NULL,
Rua VARCHAR (40),
Numero INT,
PRIMARY KEY (Registro)
)ENGINE = INNODB;

create table telefonepaciente(
RegistroCE INT NOT NULL,
Telefone INT NOT NULL,
PRIMARY KEY (RegistroCE, Telefone),
FOREIGN KEY (RegistroCE) REFERENCES paciente (Registro)
)ENGINE = INNODB;

create table andar(
NumAndar TINYINT NOT NULL,
DescAndar TEXT,
PRIMARY KEY (NumAndar)
)ENGINE = INNODB;

create table especialidade(
CodEspec INT NOT NULL,
NomeEspec VARCHAR (40),
PRIMARY KEY (CodEspec)
)ENGINE = INNODB;

create table enfermaria(
NumAndarCE TINYINT NOT NULL,
CodEnfermaria INT NOT NULL,
NomeEnfermaria VARCHAR (40),
SituacaoEnfermaria TEXT,
PRIMARY KEY (NumAndarCE, CodEnfermaria),
FOREIGN KEY (NumAndarCE) REFERENCES andar (NumAndar)
)ENGINE = INNODB;

create table tipo(
CodTipo INT NOT NULL,
NomeTipo VARCHAR (40),
PRIMARY KEY (CodTipo)
)ENGINE = INNODB;

create table leito(
NumLeito INT NOT NULL,
SituacaoLeito TEXT,
CodTipoCE INT NOT NULL,
CodEspecCE INT NOT NULL,
NumAndarCE TINYINT NOT NULL,
CodEnfermariaCE INT NOT NULL,
TipoEspecialidade TEXT,
PRIMARY KEY (NumLeito),
FOREIGN KEY (CodTipoCE) REFERENCES tipo (CodTipo),
FOREIGN KEY (CodEspecCE) REFERENCES especialidade (CodEspec),
FOREIGN KEY (NumAndarCE) REFERENCES andar (NumAndar),

**FOREIGN KEY (CodEnfermariaCE) REFERENCES enfermaria (CodEnfermaria)**

)ENGINE = INNODB;

create table internado(
RegistroCE INT NOT NULL,
NumLeitoCE SMALLINT NOT NULL,
CRMCE INT NOT NULL,
Naturalidade VARCHAR (40),
DataInternacao DATE,
DataAlta DATE,
QtdeDiasInternado MEDIUMINT,
PRIMARY KEY (RegistroCE, NumLeitoCE, CRMCE),
FOREIGN KEY (RegistroCE) REFERENCES paciente (Registro),
FOREIGN KEY (NumLeitoCE) REFERENCES leito (NumLeito),
FOREIGN KEY (CRMCE) REFERENCES medico (CRM)
) ENGINE = INNODB;*
cfh9epnr

cfh9epnr1#

考虑代码的这一部分:

create table leito(
    ...
    FOREIGN KEY (NumAndarCE) REFERENCES andar (NumAndar),
    FOREIGN KEY (CodEnfermariaCE) REFERENCES enfermaria (CodEnfermaria)
)

同时,table enfermaria 有:

create table enfermaria(
    ...
    PRIMARY KEY (NumAndarCE, CodEnfermaria),
    FOREIGN KEY (NumAndarCE) REFERENCES andar (NumAndar)
)

您没有正确引用此表。而不是两个不同的外键 NumAndar 以及 CodEnfermaria ,您需要一个同时引用两个主键列的复合外键。所以:

create table leito(
    ...
    FOREIGN KEY (NumAndarCE, CodEnfermariaCE) 
        REFERENCES enfermaria(NumAndarCE, CodEnfermaria)
)

另一个问题是那个专栏 internado(NumLeitoCE) 数据类型不同于 leito(NumLeito) ,它引用了:您需要将其从 SMALLINTINT .
通过这些更改,您的代码在这个数据库中运行良好。

qv7cva1a

qv7cva1a2#

你有两个小问题,你需要一把钥匙(德国法典)
在internado numleitoce int中不能为null,必须为int

create table medico(
CRM INT NOT NULL,
NomeMedico VARCHAR (40) NOT NULL,
NomeDepto VARCHAR (40),
ChefeDepto VARCHAR (40),
Especialidade1 VARCHAR(40),
Especialidade2 VARCHAR (40),
PRIMARY KEY (CRM)
)ENGINE = INNODB;

create table paciente(
Registro INT NOT NULL,
NomePac VARCHAR (40) NOT NULL,
DataNascimento DATE NOT NULL,
SexoPac ENUM ('M','F') NOT NULL,
Rua VARCHAR (40),
Numero INT,
PRIMARY KEY (Registro)
)ENGINE = INNODB;

create table telefonepaciente(
RegistroCE INT NOT NULL,
Telefone INT NOT NULL,
PRIMARY KEY (RegistroCE, Telefone),
FOREIGN KEY (RegistroCE) REFERENCES paciente (Registro)
)ENGINE = INNODB;

create table andar(
NumAndar TINYINT NOT NULL,
DescAndar TEXT,
PRIMARY KEY (NumAndar)
)ENGINE = INNODB;

create table especialidade(
CodEspec INT NOT NULL,
NomeEspec VARCHAR (40),
PRIMARY KEY (CodEspec)
)ENGINE = INNODB;

create table enfermaria(
NumAndarCE TINYINT NOT NULL,
CodEnfermaria INT NOT NULL,
NomeEnfermaria VARCHAR (40),
SituacaoEnfermaria TEXT,
PRIMARY KEY (NumAndarCE, CodEnfermaria),
KEY (CodEnfermaria),
FOREIGN KEY (NumAndarCE) REFERENCES andar (NumAndar)
)ENGINE = INNODB;

create table tipo(
CodTipo INT NOT NULL,
NomeTipo VARCHAR (40),
PRIMARY KEY (CodTipo)
)ENGINE = INNODB;

create table leito(
NumLeito INT NOT NULL,
SituacaoLeito TEXT,
CodTipoCE INT NOT NULL,
CodEspecCE INT NOT NULL,
NumAndarCE TINYINT NOT NULL,
CodEnfermariaCE INT NOT NULL,
TipoEspecialidade TEXT,
PRIMARY KEY (NumLeito),
FOREIGN KEY (CodTipoCE) REFERENCES tipo (CodTipo),
FOREIGN KEY (CodEspecCE) REFERENCES especialidade (CodEspec),
FOREIGN KEY (NumAndarCE) REFERENCES andar (NumAndar),
FOREIGN KEY (CodEnfermariaCE) REFERENCES enfermaria (CodEnfermaria)
)ENGINE = INNODB;

create table internado(
RegistroCE INT NOT NULL,
NumLeitoCE INT NOT NULL,
CRMCE INT NOT NULL,
Naturalidade VARCHAR (40),
DataInternacao DATE,
DataAlta DATE,
QtdeDiasInternado MEDIUMINT,
PRIMARY KEY (RegistroCE, NumLeitoCE, CRMCE),
FOREIGN KEY (RegistroCE) REFERENCES paciente (Registro),
FOREIGN KEY (NumLeitoCE) REFERENCES leito (NumLeito),
FOREIGN KEY (CRMCE) REFERENCES medico (CRM)
) ENGINE = INNODB;

相关问题