【问题标题】:How do I add a foreign key to a table in Sequel Pro?如何在 Sequel Pro 中向表中添加外键?
【发布时间】:2015-04-19 04:06:43
【问题描述】:

我正在尝试向 Sequel Pro 中的表添加外键(使用 UI)。

我有两个表:“标题”和“类别”如下:

CREATE TABLE `titles` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `title` tinytext NOT NULL,
  `category` varchar(256) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `category` (
  `key` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(256) NOT NULL DEFAULT '',
  PRIMARY KEY (`key`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

我想创建一个外键,但我没有尝试过。

类别表应该是一个简单的查找表。我想从大约 6 到 8 个不同的选择中为每个标题分配一个类别。

最初我将类别字段作为 tinytext,但我会收到错误:

“MySQL 错误 1170 (42000):在没有密钥长度的密钥规范中使用了 BLOB/TEXT 列”。

在这里搜索,发现你不能那样使用文本字段,所以我切换到 Varchar 并添加了 256 的长度。现在我得到:

MySQL 说:无法创建表 'lit.#sql-2bf3_2' (errno: 150)。

如何为我的表创建外键?

在 Access 中,这很容易做到。 Access 以某种方式将表中的唯一键与查找相关联,但随后隐藏了键并改为显示文本字段。如何使用 Sequel Pro 和 MySQL 获得类似的结果?

编辑:

所以,为了澄清这就是我现在所处的位置。我在标题表中的类别字段上添加了一个索引(第一张图片)。

我已将类别表中的“关键”字段更改为 CategoryID(第二张图片)。

但是,我似乎仍然无法在两个表之间创建关系。我得到同样的错误

【问题讨论】:

  • 你的外键和它的引用需要是相同的数据类型。将 category 更改为标题上的 INT,并首先对其进行索引。
  • Sequel Pro 中,您可以使用 Relations 选项卡(就在 Content 选项卡的右侧)创建外部键。

标签: mysql sequelpro


【解决方案1】:

由于category 将是您在titles 之外的查找表,因此您需要在category 上创建一个引用外键的索引。它们都需要是相同的数据类型(通常是INT,尽管有时您可以在某些情况下使用CHAR(2) 变量,但通常不是必需的)。由于您只期望 6-8 个类别,因此我将其设为 INT(1)(或者可能是 INT(2) 以确保安全)。

在这种情况下,您需要创建类似categoryId 的东西,首先需要对其进行索引,然后连接到似乎不存在的category 上的外键;我不确定你想使用像key 这样的术语。为什么不直接将categoryId 设为category 的主键?这样,当您在 titles 上创建具有相同名称的外键时,它应该可以正常链接。

编辑:

澄清一下,在category 上创建categoryID 后,您可以在titles 下执行此操作

ALTER TABLE Orders
ADD CONSTRAINT fk_categoryID
FOREIGN KEY (`categoryId`) REFERENCES `category`(`categoryId`)

编辑:

这是使用原始布局的修改。这应该适合你:

CREATE TABLE IF NOT EXISTS `category` (
  `key` int(2) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(256) NOT NULL DEFAULT '',
  PRIMARY KEY (`key`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;



CREATE TABLE IF NOT EXISTS `titles` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `title` tinytext NOT NULL,
  `categoryID` int(2) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `categoryID` (`categoryID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


ALTER TABLE `titles`
  ADD CONSTRAINT `titles_ibfk_1` FOREIGN KEY (`categoryID`) REFERENCES `category` (`key`);

【讨论】:

  • 我需要在titles 表中的category 字段上建立索引吗?我将键字段更改为 categoryID(这似乎是一个显而易见的选择),但我似乎仍然无法连接两个表。
  • 是的。为了能够使用外键,引用键必须是索引。
  • 注意,数据类型也必须相同。您已将其设置为 titles 上的 varchar。它应该是一个 INT
  • 你之前的问题是因为不同的数据类型,一个是无符号的,一个是没有的
  • 非常感谢 nomistic 在这个问题上的努力。一旦我勾选了“未签名”按钮,我就能够创建它。哇,它不像 Access。 :)
猜你喜欢
  • 1970-01-01
  • 2019-01-11
  • 1970-01-01
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多