【问题标题】:MariaDB (MySQL?) Unable to create foreign key - REFERENCES command deniedMariaDB(MySQL?)无法创建外键 - REFERENCES 命令被拒绝
【发布时间】: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 文档,这是向已创建的表添加外键的方法。

标签: mysql database mariadb


【解决方案1】:

应该做的方式如下。

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

让我知道它是否有效。

【讨论】:

    【解决方案2】:

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

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

    将外键添加到已创建的表中。谢谢一百万,Hackerman!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 2020-01-08
      相关资源
      最近更新 更多