我在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
我尝试重新连接并重新启动服务器,但无济于事。请告诉我,我忽略了一些明显的东西。永恒的感激。
答案 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!