1

这是我最后的选择,因为我已经尝试了所有可以在 Google 和 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)
);

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

4

1 回答 1

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

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

于 2015-03-24T15:06:20.097 回答