MySQL 错误 1005:无法创建表(错误号:150)

2023-12-30

我正在尝试创建下表

 
 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 参考类型和维度之间一致..

我哪里错了??

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

您可以检查 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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 错误 1005:无法创建表(错误号:150) 的相关文章

  • 仅使用 varchar 作为外键的 MySQL 表

    我有一个包含单个唯一 VARCHAR 512 字段的表 我想让另一个表保存对第一个表的外键引用 两个表都使用 InnoDB 如果我向第二个表添加 VARCHAR 512 键并在其上添加外键约束 512 字节长的数据是否会保存两次 如果是这样
  • 如何将 SQL Server 中同一表中的一列插入到另一列中

    我需要将一列的数据插入到同一个表中的另一列中 谁能告诉我这个怎么写 Thanks UPDATE table SET col 2 col 1
  • MySQL存储过程变量作为表名连接

    我想在存储过程中执行以下查询而不准备查询 因为这给我带来了 OUT 传回参数的问题 DELIMITER CREATE PROCEDURE Test IN CID BIGINT 20 IN IDs LONGTEXT BEGIN EXECUTE
  • XP及PHP MYSQL 练级系统

    我已经查看了所有提出的问题和答案 但我似乎找不到最适合我的答案 我想做的是开发一个系统 当用户达到一定的 XP 限制时 系统会进入下一个级别 它显示了下一个 XP 之前需要多少 XP So lvl1 0 gt lvl2 256 gt lvl
  • SQLite SQL 查询出现问题[重复]

    这个问题在这里已经有答案了 我正在尝试在 SQLite 3 中运行以下查询 SELECT DISTANCE latitude longitude AS distance FROM country WHERE id NOT LIKE HAVI
  • 将用户定义的表类型从 VBA 传递到 SQL

    我的任务是创建一个 Excel 电子表格作为 SQL 数据库的前端 以及一些对数据执行复杂计算的 C 我的老板想要前端作为电子表格 而计算对于 VBA 来说似乎太复杂了 目前 检索数据集的存储过程运行良好 然后 用户将在 Excel 中编辑
  • Rails 中 WHERE 子句中的 ALL 运算符

    关联关系如下图所示 InstructorStudent has many fees Fee belongs to instructor student 我想要获得在所有给定数组中具有每月详细信息的指导学生 如果其中任何一个中不存在每月详细信
  • 删除、截断或删除以清理 MySQL 中的表

    我正在尝试清理表格 但没有摆脱表格的实际结构 我有一个id自动递增的列 我不需要保留ID号 但我确实需要它来保持其自动递增的特性 我发现了删除和截断 但我担心其中之一会完全删除整个表 从而使未来的插入命令变得无用 如何从表中删除所有记录以便
  • PHP 和 MySQL 的重音字符错误

    我的问题是 直接通过 PHP 编写的内容是正确重音的 但是当重音单词来自 MySQL 时 字母会像这样 我尝试使用html charset as ISO 8859 1它修复了 MySQL 字母 但破坏了其他字母 解决这一切的一种方法是设置我
  • 使用 Proc sql 和 Teradata 在 SAS 中编写高效查询

    编辑 这是一组更完整的代码 它准确地显示了下面的答案所发生的情况 libname output data files jeff let DateStart 01Jan2013 d let DateEnd 01Jun2013 d proc s
  • 在 BIRT 中输入参数后更新数据集查询

    在 BIRT 报告设计中传递参数后 如何更改或更新数据集的查询 详细说明 我有一个如下所示的查询 WHERE 该参数标记可以保存不同的值 在用户输入参数后 它看起来像这样 例如 WHERE column name 1 or WHERE co
  • PHP多图像文件上传并存储到文件夹和数据库

    我正在建立一个网站 向夜间狂欢者展示大城市夜总会场所和活动的列表 我正在尝试构建一个后端页面 管理员可以在其中添加俱乐部并输入信息 例如机构名称 位置 相对价格等 当然还有俱乐部的一些图像 每个俱乐部必须至少有一张图像 即主图像 可以有额外
  • 如何检查一个值是否已经存在以避免重复?

    我有一个 URL 表 但我不想要任何重复的 URL 如何使用 PHP MySQL 检查给定 URL 是否已在表中 如果您不想重复 可以执行以下操作 添加唯一性约束 use REPLACE http dev mysql com doc ref
  • 无法批量加载。操作系统错误代码 5(访问被拒绝。)

    由于某些奇怪的原因 我在执行批量插入时遇到问题 BULK INSERT customer stg FROM C Users Michael workspace pydb data andrew out txt WITH FIRSTROW 0
  • 查询嵌套查询结果中两列的位置

    我正在编写这样的查询 select from myTable where X in select X from Y and XX in select X from Y X 列和 XX 列的值必须位于同一查询的结果中 select X fro
  • PHP:如何检查总数。 URL 中的参数?

    我正在使用 REQUEST 检索参数 有没有办法找到总数 URL 中的参数 而不是检索每个参数然后进行计数 这将为您提供总数 分隔的 URL 查询参数 count explode SERVER QUERY STRING 如果您只想要唯一的参
  • 合并并添加两个表中的值

    是否可以制作一个在两个表中添加值的查询 例如 假设您有两张表 id value a 1 c 2 d 3 f 4 g 5 and id value a 1 b 2 c 3 d 4 e 5 然后 当您 添加 两个表时 您将获得 id 匹配的结果
  • 数据读取过程中遇到致命错误

    我正在进行定期更新表扫描 Using connect1 As New MySqlConnection ConnectLocalhost serverString connect1 Open Dim cmd New MySqlCommand
  • 如何在审计触发器中使用system_user但仍使用连接池?

    我想做以下两件事 在我的数据库表上使用审计触发器来识别哪个用户更新了什么 使用连接池来提高性能 对于 1 我在数据库触发器中使用 system user 来识别进行更改的用户 但这阻止我执行需要通用连接字符串的 2 有没有一种方法可以让我充
  • 根据最大值连接表

    这是我正在谈论的内容的一个简化示例 Table students exam results id name id student id score date 1 Jim 1 1 73 8 1 09 2 Joe 2 1 67 9 2 09 3

随机推荐