2013-07-23 21 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」(errnoに:150)

テーブルの外部キーによって参照されている:私はすでにFKが一意であることと何のタイプミスが(存在しないことを確認した


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

しかし、コントロールを与えてもあなたは決して知らない: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)の状態を確認することができます。もう1つの選択肢は、テーブルの作成後に外部キー制約を追加することです。

あなたのケースでは、エンジンの種類が不足しているようです。列の型も一致する必要があります。参照先テーブルの主キーは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のrootログインから "SHOW ENGINE INNODB STATUS"をチェックして、参照されたテーブルの列データ型が私のものと一致していないことを見ました作成。ありがとう。 –

0

あなたは気楽です! は、すべての最初の私はInnoDBの状況を確認し、probleの理由は、私は削除にヌル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)  
) ; 

このようにクエリを変更し、それを実行します。今は仕事です。 とにかくあなたが私に提案した変更を実行します

関連する問題