【发布时间】:2017-01-02 05:55:48
【问题描述】:
我在 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
我尝试重新连接并重新启动服务器,但无济于事。请告诉我我忽略了一些明显的东西。永远的感激。
【问题讨论】:
-
你可以试试:
ALTER TABLE isotemp ADD CONSTRAINT FOREIGN KEY (fk_statusid) REFERENCES ISO-3166-2-status (id); -
虽然
ALTER TABLE isotemp ADD CONSTRAINT FOREIGN KEY (statusid) REFERENCES ISO-3166-2-status(id);成功了,但没有成功。感谢您的指点。我确定我已经尝试过了,但我想我错了。知道为什么这个表格应该生效,而另一个没有吗? -
因为根据 MariaDB 文档,这是向已创建的表添加外键的方法。