MySQL - 无法添加外键约束 - 拉丁语/西里尔语

时间:2015-03-24 14:58:33

标签: php mysql phpmyadmin cyrillic utf8mb4

这是我的最后一招,因为我已经尝试了一些我可以在谷歌和Stack Overflow上找到的东西。

在问这个问题之前,我已经彻底搜索了一个答案。我发现人们从MySQL那里得到了同样的错误信息,但是他们的解决方案对我有用,因为我没有做那个特定的事情(不同的列类型)错误。

我遇到外键问题,相同的类型(varchar(xx),其中xx在两种情况下都是相同的长度; NOT NULL),但仍然给我一个错误,由PHPMyAdmin的命令SHOW ENGINE INNODB STATUS描述为:

  

2015-03-24 16:04:21 66c表arhiva / privilegija的外键约束出错:
      外键(korisnik_ime)参考文献korisnik(ime),
       外键(firma_naziv)参考文献firma(naziv)
      ):
      在引用的表中找不到索引       引用的列显示为第一列或列类型       在表中,引用的表与约束不匹配。

这是我的数据库模式,对不起英文名称(顺便说一下,我第一次遇到这个问题时,列名是西里尔字符,但即使我用拉丁文转换它们 - 你在这里看到的 - 我的问题是已解决):

DROP DATABASE IF EXISTS arhiva;
CREATE DATABASE arhiva
  DEFAULT CHARACTER SET utf8mb4
  DEFAULT COLLATE utf8mb4_general_ci;
USE arhiva;

CREATE TABLE `korisnik` (
  ime VARCHAR(30) NOT NULL ,
  lozinka CHAR(60) NOT NULL
);

CREATE TABLE `firma` (
  naziv VARCHAR(50) NOT NULL
);

CREATE TABLE `privilegija` (
  korisnik_ime VARCHAR(30) NOT NULL ,
  firma_naziv VARCHAR(50) NOT NULL ,
  pristap CHAR(1) NOT NULL ,
  FOREIGN KEY (korisnik_ime) REFERENCES korisnik(ime) ,
  FOREIGN KEY (firma_naziv) REFERENCES firma(naziv)
);

请您指导我解决这个问题的正确方向。我认为使用西里尔字符是问题,但事实证明问题出在其他地方。

1 个答案:

答案 0 :(得分:0)

添加PRIMARY KEY(),如下所示:

CREATE TABLE `korisnik` (
ime VARCHAR(30) NOT NULL ,
lozinka CHAR(60) NOT NULL,
PRIMARY KEY(ime)
);

CREATE TABLE `firma` (
naziv VARCHAR(50) NOT NULL,
PRIMARY KEY(naziv)
);

现在你有一个索引,所以外键约束应该有效。