【问题标题】:MySQL - Foreign Key does not work even when InnoDB is on (Ubuntu 16.04)(Error code: 1215)MySQL - 即使 InnoDB 开启,外键也不起作用(Ubuntu 16.04)(错误代码:1215)
【发布时间】:2017-06-07 21:25:15
【问题描述】:

我对 MySQL 表的教科书示例有疑问。 诀窍是,它可以在 Windows 操作系统上运行,但由于某些奇怪的原因,它不适用于 Linux。 我尝试配置默认引擎,它肯定是 InnoDB,但由于某种奇怪的原因它仍然不是机器人不工作。

CREATE TABLE radnik(
     Mbr integer NOT NULL,
     Ime varchar(20) NOT NULL,
     Prz varchar(25) NOT NULL,
     Sef integer,
     Plt decimal(10, 2),
     Pre decimal(6, 2),
     God date NOT NULL,
     CONSTRAINT radnik_PK PRIMARY KEY (Mbr),
     CONSTRAINT radnik_FK FOREIGN KEY (Sef) REFERENCES radnik (Mbr),
     CONSTRAINT radnik_CH CHECK (Plt>500)    
)engine=innodb;

CREATE TABLE projekat(
     Spr integer NOT NULL,
     Ruk integer NOT NULL,
     Nap varchar(50),
     Nar varchar(50),
     CONSTRAINT projekat_PK PRIMARY KEY (Spr),
     CONSTRAINT projekat_FK FOREIGN KEY (Ruk) REFERENCES radnik (Mbr),
     CONSTRAINT projekat_UK UNIQUE (Nap)
)engine=innodb;
CREATE TABLE radproj(
     Spr integer NOT NULL,
     Mbr integer NOT NULL,
     Brc integer NOT NULL,
     CONSTRAINT radproj_PK PRIMARY KEY (Spr, Mbr),
     CONSTRAINT radproj_rad_FK FOREIGN KEY (Mbr) REFERENCES radnik(Mbr),
     CONSTRAINT radproj_prj_FK FOREIGN KEY (Spr) REFERENCES projekat(Spr)
);

【问题讨论】:

标签: mysql linux ubuntu foreign-keys innodb


【解决方案1】:

对于自引用外键,我认为您不能将外键约束放在CREATE TABLE 语句中。您必须先创建表,然后使用ALTER TABLE 添加约束。

这对我有用。

CREATE TABLE radnik(
     Mbr integer NOT NULL,
     Ime varchar(20) NOT NULL,
     Prz varchar(25) NOT NULL,
     Sef integer,
     Plt decimal(10, 2),
     Pre decimal(6, 2),
     God date NOT NULL,
     CONSTRAINT radnik_PK PRIMARY KEY (Mbr)  
)engine=innodb;

ALTER TABLE radnik ADD CONSTRAINT radnik_FK FOREIGN KEY (Sef) REFERENCES radnik (Mbr);

顺便说一句,MySQL 忽略了CHECK 约束。

【讨论】:

  • 它工作!非常感谢 。但这对我来说仍然是个谜,为什么它可以像现在这样在 Windows 上运行,而不是在 Linux 上运行。
  • 你在运行不同的 MySQL 版本吗?
  • 没有多余的 Win PC 所以我无法检查正确的版本。 Ubuntu 软件包中的 mysql-server 可能不是最新的。可以说是因为我尝试更新表时遇到的下一个错误:错误代码:1452。无法添加或更新子行:外键约束失败编辑:它是最新版本的 mysql。 Win PC 是最新版本,所以版本不是问题。
  • 修好了,我猜教科书的错误写得不太好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 2015-05-27
  • 2017-09-18
  • 2014-10-22
  • 2016-06-04
  • 1970-01-01
  • 2018-09-15
相关资源
最近更新 更多