【问题标题】:MySQL ERROR 1005: Can't create table (errno: 150)MySQL 错误 1005: 无法创建表 (errno: 150)
【发布时间】:2013-07-22 15:59:09
【问题描述】:

我正在尝试创建下表

 
 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)

外键引用的表有:

 
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 引用类型和维度之间重合..

我哪里错了??

数据库的其他表


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

【问题讨论】:

    标签: mysql sql sql-server mysql-workbench


    【解决方案1】:

    您可以检查 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;
    

    【讨论】:

    • 我遇到了同样的问题,在 mysql 的 root 登录中检查了“SHOW ENGINE INNODB STATUS”,发现引用表的列数据类型与我创建的不匹配。谢谢。
    【解决方案2】:

    你真是个天才! 首先我检查了 InnoDB 的状态,问题的原因是我试图在删除时将 fk 设置为 null 所以我以这种方式更改了查询

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

    并执行它。现在它的工作。 无论如何,现在我会执行你建议我的更改

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-09
      • 2016-10-12
      • 1970-01-01
      • 2011-02-17
      • 2013-08-17
      • 2012-10-07
      • 1970-01-01
      相关资源
      最近更新 更多