2013-07-23 24 views
7

Sto cercando di creare la seguente tabellaMySQL ERRORE 1005: Impossibile creare tabella (errno: 150)


create table messaInScena 
    (
    data    date, 
    ora    time, 
    spazio    varchar(20), 
    spettacolo   varchar(40), 
    postiDisponibili smallint, 
    prezzoIntero  decimal(5,2), 
    prezzoRidotto  decimal(5,2), 
    prezzoStudenti  decimal(5,2), 
    primary key (data, ora, spazio), 
    foreign key (spazio) references spazio(nome) 
on update cascade on delete set null, 
    foreign key (spettacolo) references spettacolo(titolo) 
on update cascade on delete set null, 
    constraint RA3_1 check (postiDisponibili >= 0)  
) ; 

ma ottengo il seguente errore: Codice di errore: 1005 Impossibile creare la tabella 'teatrosql .messainscena'(errno: 150)

le tabelle a cui fa riferimento chiavi esterne sono:


create table spazio 
    (
    nome    varchar(20) primary key, 
    indirizzo  varchar(40) not null, 
    pianta   varchar(20), 
    capienza   smallint 
); 

create table spettacolo 
    (
    titolo    varchar(40) primary key, 
    descrizione  LONGBLOB, 
    annoProduzione  char(4) 
); 

ho già verificato che il fk sono unici e che non ci siano errori di battitura (ma dato un controllo anche a te che non sai mai: D). Come puoi vedere i campi di riferimento sono chiavi primarie. tra campi e tipi e dimensioni di riferimento fk coincidono ..

dove mi sbaglio ??

le altre tabelle di DB


create table teatro 
    (
    nome    varchar(20) primary key, 
    telefono   varchar(15), 
    fax    varchar(15), 
    indirizzo  varchar(40) not null, 
    email   varchar(30), 
    url    varchar(30) 
); 

create table biglietteria 
    (
    nome    varchar(20) primary key, 
    indirizzo  varchar(40) not null, 
    email   varchar(30), 
    telefono   varchar(15), 
    teatro   varchar(20), 
    foreign key (teatro) references teatro(nome) 
    on update cascade on delete set null 
); 

create table orario 
    (
    biglietteria  varchar(20), 
    giorno   varchar(10), 
    inizio   time, 
    fine    time, 
    primary key(biglietteria, giorno, inizio), 
    foreign key (biglietteria) references biglietteria(nome) 
    on update cascade on delete cascade 
); 

create table notizia 
    (
    data  date, 
    ora   time, 
    oggetto  varchar(100), 
    testo  LONGBLOB, 
    primary key(data, ora, oggetto) 
); 

create table newsletter 
    (
    teatro  varchar(20), 
    data  date, 
    ora   time, 
    oggetto  varchar(100), 
    primary key(teatro, data, ora, oggetto), 
    foreign key (teatro) references teatro(nome)on update cascade on delete cascade, 
    foreign key (data, ora, oggetto) references notizia(data, ora, oggetto) on update cascade on delete cascade 
); 

create table dipendente 
    (
    cf      char(16) primary key, 
    nome     varchar(20) not null, 
    cognome    varchar(20) not null, 
    dataDiNascita   date, 
    luogoDiNascita   varchar(20), 
    residenza    varchar(30), 
    telefonoFisso   varchar(15), 
    telefonoMobile   varchar(15), 
    email     varchar(30) 
); 

create table lavoro 
    (
    teatro    varchar(20), 
    dipendente   char(16), 
    dataAssunzione  date, 
    ruolo    varchar(5), 
    cda     boolean, 
    primary key(teatro, dipendente), 
    foreign key (teatro) references teatro(nome) on update cascade on delete cascade, 
    foreign key (dipendente) references dipendente(cf) on update cascade on delete cascade, 
    constraint RA1 check (
    cda = false or 
    (year(current_date) - year(dataAssunzione) > 10) or 
    (year(current_date) - year(dataAssunzione) = 10 and 
     month(current_date) > month(dataAssunzione)) or 
    (year(current_date) - year(dataAssunzione) = 10 and 
     month(current_date) = month(dataAssunzione) and 
     day(current_date) >= day(dataAssunzione)) 
    ), 
     check (ruolo in ('CA', 'POD', 'CUSRP', 'ACF')) 
); 

create table stipendio 
    (
    dipendente char(16), 
    inizio  date, 
    importo  decimal(6,2), 
    primary key(dipendente, inizio), 
    foreign key (dipendente) references dipendente(cf) on update cascade on delete cascade 
) ; 

create table luogo 
    (
    teatro  varchar(20), 
    spazio  varchar(20), 
    primary key(teatro, spazio), 
    foreign key (teatro) references teatro(nome) on update cascade on delete cascade, 
    foreign key (spazio) references spazio(nome) on update cascade on delete cascade 
) ; 

risposta

11

È possibile controllare lo stato di InnoDB (SHOW ENGINE INNODB STATUS) per determinare il motivo esatto per cui i vincoli stanno fallendo. L'altra opzione è aggiungere i vincoli di chiave esterna dopo aver creato la tabella.

Nel tuo caso, sembra che manchi il tipo di motore. Anche i tipi di colonna devono corrispondere. La chiave primaria nelle tabelle di riferimento è molto probabilmente NOT NULL e non lo è in messaInScena.

create table spazio 
    (
    nome    varchar(20) NOT NULL primary key, 
    indirizzo  varchar(40) not null, 
    pianta   varchar(20), 
    capienza   smallint 
) ENGINE=InnoDB; 

create table spettacolo 
    (
    titolo    varchar(40) NOT NULL primary key, 
    descrizione  LONGBLOB, 
    annoProduzione  char(4) 
) ENGINE=InnoDB; 

create table messaInScena 
    (
    data    date, 
    ora    time, 
    spazio    varchar(20) NOT NULL, 
    spettacolo   varchar(40) NOT NULL, 
    postiDisponibili smallint, 
    prezzoIntero  decimal(5,2), 
    prezzoRidotto  decimal(5,2), 
    prezzoStudenti  decimal(5,2), 
    primary key (data, ora, spazio), 
    foreign key (spazio) references spazio(nome) 
on update cascade on delete set null, 
    foreign key (spettacolo) references spettacolo(titolo) 
on update cascade on delete set null, 
    constraint RA3_1 check (postiDisponibili >= 0)  
) ENGINE=InnoDB; 
+1

Ho avuto lo stesso problema, ho controllato "SHOW ENGINE INNODB STATUS" dal login di root in mysql, ho visto che il tipo di dati di colonna delle tabelle di riferimento non corrispondeva con quelli che ero creazione. Grazie. –

0

sei un genio! innanzi tutto controllato lo stato di InnoDB, e il motivo del proble era che ho cercato di impostare nulla la fk su delete così ho cambiato la query in questo modo


create table messaInScena 
    (
    data    date, 
    ora    time, 
    spazio    varchar(20), 
    spettacolo   varchar(40), 
    postiDisponibili smallint, 
    prezzoIntero  decimal(5,2), 
    prezzoRidotto  decimal(5,2), 
    prezzoStudenti  decimal(5,2), 
    primary key (data, ora, spazio), 
    foreign key (spazio) references spazio(nome) 
on update cascade on delete cascade, 
    foreign key (spettacolo) references spettacolo(titolo) 
on update cascade on delete cascade, 
    constraint RA3_1 check (postiDisponibili >= 0)  
) ; 

ed eseguirlo. ora è lavoro. in ogni caso ora apporterò le modifiche che mi suggerisci

Problemi correlati