如何在Sequel Pro中为表添加外键?

时间:2015-04-19 04:06:43

标签: mysql sequelpro

我正在尝试在Sequel Pro中使用UI添加外键(使用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'(错误号:150)。

如何为我的表创建外键?

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

编辑:

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

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

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

So this is where I'm at right now.

enter image description here

1 个答案:

答案 0 :(得分:2)

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

在这种情况下,您需要创建首先需要编入索引的categoryId,然后连接到category上似乎不存在的外键;我不确定您是否要使用像key这样的术语。为什么不在categoryId上设置category主键?这种方式当您在titles上创建具有相同名称的外键时,它应该链接正常。

编辑:

稍微澄清一点,在categoryID上创建category之后,您可以在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`);