【问题标题】:MySql Error 1005 erno:105 Can't create tableMySql 错误 1005 erno:105 无法创建表
【发布时间】:2016-02-11 23:38:56
【问题描述】:
drop table if exists patient;
drop table if exists pan;
drop table if exists device;
drop table if exists sensor;
drop table if exists actuator;
drop table if exists wears;
drop table if exists connects;
drop table if exists period;
drop table if exists reading;
drop table if exists setting;
drop table if exists lives;
drop table if exists municipality;

create table patient
    (patient_name varchar(255),
     patient_number integer(10),
     patient_address varchar(255),
     primary key(patient_number));

create table pan
    (pan_domain varchar(255),
     pan_phone integer(9),
     primary key(pan_domain));

create table device
    (device_snum integer(10),
     device_manuf varchar(255),
     device_description varchar(255),
     primary key(device_snum, device_manuf));

create table municipality
    (municipality_nut4code integer(10),
     municipality_name varchar(255),
     primary key(municipality_nut4code));

create table period
    (period_start time,
     period_end time,
     primary key(period_start, period_end));

create table sensor
    (sensor_snum integer(10),
     sensor_manuf varchar(255),
     sensor_units varchar(255),
     primary key(sensor_snum, sensor_manuf),
     foreign key(sensor_snum) references device(device_snum),
     foreign key(sensor_manuf) references device(device_manuf));

create table actuator
    (actuator_snum integer(10),
     actuator_manuf varchar(255),
     actuator_units varchar(255),
     primary key(actuator_snum, actuator_manuf),
     foreign key(actuator_snum) references device(device_snum),
     foreign key(actuator_manuf) references device(device_manuf));

create table wears
    (wears_start time,
     wears_end time,
     wears_patient integer(10),
     wears_pan varchar(255),
     primary key(wears_start, wears_end, wears_patient),
     foreign key(wears_start) references period(period_start),
     foreign key(wears_end) references period(period_end),
     foreign key(wears_patient) references patient(patient_number),
     foreign key(wears_pan) references pan(pan_domain));   

create table connects
    (connects_start time,
     connects_end time,
     connects_snum integer(10),
     connects_manuf varchar(255),
     connects_pan varchar(255),
     primary key(connects_start, connects_end, connects_snum,    connects_manuf),
     foreign key(connects_start) references period(period_start),
     foreign key(connects_end) references period(period_end),
     foreign key(connects_snum) references device(device_snum),
     foreign key(connects_manuf) references device(device_manuf),
     foreign key(connects_pan) references pan(pan_domain));

 create table reading
    (reading_snum integer(10),
     reading_manuf varchar(255),
     reading_datetime date,
     reading_value numeric(10,2),
     primary key(reading_snum, reading_manuf, reading_datetime),
     foreign key(reading_snum) references sensor(sensor_snum),
     foreign key(reading_manuf) references sensor(sensor_manuf));

create table setting
    (setting_snum integer(10),
     setting_manuf varchar(255),
     setting_datetime date,
     setting_value numeric(10,2),
     primary key(setting_snum, setting_manuf, setting_datetime),
     foreign key(setting_snum) references actuator(actuator_snum),
     foreign key(setting_manuf) references actuator(actuator_manuf));

create table lives
    (lives_start time,
     lives_end time,
     lives_patient integer(10),
     lives_municipality integer(10),
     primary key(lives_start, lives_end, lives_patient),
     foreign key(lives_start) references period(period_start),
     foreign key(lives_end) references period(period_end),
     foreign key(lives_patient) references patient(patient_number),
     foreign key(lives_municipality) references    municipality(municipality_nut4code));

当我尝试在 MySQL 上创建此数据库时,我收到一条错误消息,提示 ERROR 1005 (HY000) can't create table ***** (errno: 150)。无法创建的表是具有外键的表。我已经检查了数据类型,并且引用与先前创建的表的主键匹配。 我没有得到错误。有人可以帮忙吗?

【问题讨论】:

  • 也许你的 MySQL 服务器有一个默认的 MISAM 引擎?尝试将ENGINE=InnoDB 添加到所有表定义中!

标签: mysql sql


【解决方案1】:

由于您引用的表中有复合键,因此您也应该将外键设为复合键。例如:

create table sensor
    (sensor_snum integer(10),
     sensor_manuf varchar(255),
     sensor_units varchar(255),
     primary key(sensor_snum, sensor_manuf),
     foreign key(sensor_snum, sensor_manuf) references device(device_snum, device_manuf));

另外,如果您有两个具有相同外键的表,则需要为外键命名。所有外键都需要有不同的名字,如果你没有明确给出名字,MySQL 会根据外键中的列生成名字,你会得到重复的。

【讨论】:

  • 感谢您的回复。我将所有外键和一些确实创建的表制作成了复合材料,但表“磨损”、“连接”和“存活”仍未创建。至于重复的名字,我已经用独特的方式写了所有的名字以避免这种情况。
  • 知道了!原来我在制作外键复合时犯了一个愚蠢的错误。非常感谢!
猜你喜欢
  • 2012-10-15
  • 1970-01-01
  • 2013-07-22
  • 2019-06-14
  • 2013-03-30
  • 1970-01-01
  • 2016-08-10
  • 2020-04-10
  • 1970-01-01
相关资源
最近更新 更多