2013-07-23 122 views
7

我試圖創建下表MySQL錯誤1005:無法創建表(錯誤: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)  
) ; 

,但我得到了以下錯誤: 錯誤代碼:1005無法創建表「teatrosql .messainscena」(錯誤:150)

該表由外鍵引用的是:


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

我已經驗證了FK是獨一無二的,有沒有錯別字(但同時給予了你永遠不知道的控制權:D)。正如你所看到的,參考字段是主鍵。字段與fk的參考類型和尺寸相吻合。

我在哪裏錯了?

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

回答

11

您可以檢查的InnoDB(SHOW ENGINE INNODB STATUS)的狀態,以確定爲什麼約束失敗的確切原因。另一個選項是在創建表之後添加外鍵約束。

就你而言,看起來你缺少引擎類型。列類型也必須匹配。參考表上的主鍵最有可能是NOT NULL,並且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

我有同樣的問題,從MySQL的根登錄檢查「SHOW ENGINE INNODB STATUS」,看到引用表的列數據類型不匹配我是創建。謝謝。 –

0

你是一個真正的! 首先我檢查的InnoDB的狀態和proble的原因是,我試圖設置爲null。刪除該FK,所以我以這種方式


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

並執行它改變了查詢。現在是工作。 無論如何,我會攜帶你建議我的變化

相關問題