2013-07-23 15 views
7

Próbuję utworzyć następującą tabelęMySQL Błąd 1005: Nie można utworzyć tabelę (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)  
) ; 

ale pojawia się następujący błąd: Error Code: 1005 Nie można utworzyć tabeli „teatrosql .messainscena”(errno: 150)

tabele które odwołuje kluczy obcych są:


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) 
); 

już zweryfikowane, że fk są wyjątkowe i że nie ma żadnych literówek (ale pod kontrolą masz również to, czego nigdy nie znasz: D). Jak widać pola referencyjne to klucze podstawowe. między polami a typami odniesienia fk i wymiarami pokrywają się.

gdzie się mylę?

na inne tabele 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 
) ; 

Odpowiedz

11

Można sprawdzić status InnoDB (SHOW ENGINE INNODB STATUS), aby określić dokładną przyczynę ograniczenia są niepowodzeniem. Inną opcją jest dodanie ograniczeń klucza obcego po utworzeniu tabeli.

W twoim przypadku wygląda na to, że brakuje Ci typu silnika. Typy kolumn muszą również pasować. Klucz podstawowy na tabelach, do których istnieją odnośniki, najprawdopodobniej jest NOT NULL i nie są one takie w 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

Miałem ten sam problem, zaznaczone "SHOW ENGINE INNODB STATUS" z logowania root w mysql, zobaczyłem, że typ danych kolumn tabeli odniesienia nie pasował do tych, które miałem tworzenie. Dzięki. –

0

jesteś genialny! przede wszystkim sprawdziłem status InnoDB, a powodem tego było to, że proble Próbowałem ustawić zerową FK Delete więc zmieniłem kwerendę w ten sposób


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)  
) ; 

i wykonanie go. teraz to działa. tak czy inaczej teraz będę przeprowadzać zmiany, które sugerujesz mi

Powiązane problemy