MariaDB(MySQL?)无法创建外键 - REFERENCES命令被拒绝

时间:2016-08-25 17:30:16

标签: mysql database mariadb

我在MariaDB上尝试在名为isotemp的表上设置外键,引用另一个名为ISO-3166-2-status的表。之前我曾在同一个数据库中添加了对同一用户的所有以前表的引用,但这次发生了Error Code: 1142. REFERENCES command denied to user 'symfony'@'localhost' for table 'ISO-3166-2-status.id'。我去了(https://mariadb.com/kb/en/mariadb/grant/#table-privileges)咨询文档并注意到REFERENCES特权被记录为"未使用"在两个表中作为列上下文。

当我以root身份连接时,命令GRANT REFERENCES ON geo.* TO symfony@localhost;执行时没有错误,尽管错误消息仍然存在。然后我尝试执行GRANT REFERENCES ON geo.ISO-3166-2-status to symfony@localhost;GRANT REFERENCES ON geo.isotemp to symfony@localhost;,这两个执行都没有错误,以下是SHOW GRANTS命令的输出,作为用户symfony

GRANT FILE, REFERENCES ON *.* TO 'symfony'@'localhost' IDENTIFIED BY PASSWORD '************'
GRANT ALL PRIVILEGES ON `geo`.* TO 'symfony'@'localhost'
GRANT ALL PRIVILEGES ON `symfony`.* TO 'symfony'@'localhost'
GRANT REFERENCES ON `geo`.`ISO-3166-2-status` TO 'symfony'@'localhost'
GRANT REFERENCES ON `geo`.`isotemp` TO 'symfony'@'localhost'

...但我仍然无法创建外键。有问题的外键命令:

alter table isotemp add foreign key(statusid) references `ISO-3166-2-status`.`id`;

以下是我的表格:

SHOW CREATE TABLE `isotemp`;

CREATE TABLE `isotemp` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `country` varchar(50) DEFAULT NULL,
  `alpha` char(2) NOT NULL,
  `status` varchar(50) NOT NULL,
  `statusid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=657 DEFAULT CHARSET=utf8

SHOW CREATE TABLE `ISO-3166-2-status`;

CREATE TABLE `ISO-3166-2-status` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `status` char(24) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  UNIQUE KEY `status` (`status`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8

我尝试重新连接并重新启动服务器,但无济于事。请告诉我,我忽略了一些明显的东西。永恒的感激。

2 个答案:

答案 0 :(得分:1)

应该采取的方式如下。

ALTER TABLE isotemp ADD CONSTRAINT fk_id FOREIGN KEY (statusid) REFERENCES ISO-3166-2-status(id);

让我知道它是否有效。

答案 1 :(得分:0)

Hackerman建议的用户;显然,使用MariaDB你必须使用

ALTER TABLE <table1> ADD CONSTRAINT FOREIGN KEY(fk) REFERENCES <table2>(uk);

将外键添加到已创建的表中。万分感谢Hackerman!