如何在 Sequel Pro 中向 table 添加外键?
How do I add a foreign key to a table in Sequel Pro?
我正在尝试将外键添加到 Sequel Pro 中的 table(使用 UI)。
我有两个 table:"titles" 和 "categories",如下所示:
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;
我想创建一个外键,但我尝试的都不起作用。
类别 table 应该是一个简单的查找 table。我想从大约 6 - 8 个不同的选择中为每个标题分配一个类别。
最初我将类别字段设置为 tinytext,但我会收到错误消息:
"MySQL Error 1170 (42000): BLOB/TEXT Column Used in Key Specification Without a Key Length"。
在这里搜索发现你不能那样使用文本字段,所以我切换到 Varchar 并添加了 256 的长度。现在我得到:
MySQL 说:无法创建 table 'lit.#sql-2bf3_2'(错误号:150)。
如何为 table 创建外键?
在 Access 中,这很容易完成。 Access 以某种方式将 table 中的唯一键与查找相关联,但随后隐藏该键并改为显示文本字段。如何使用 Sequel Pro 和 MySQL 获得相似的结果?
编辑:
所以,澄清一下我现在所处的位置。我在标题 table(第一张图片)的类别字段上添加了一个索引。
我已将类别 table 中的 "key" 字段更改为类别 ID(第二张图片)。
但是,我似乎仍然无法在两个 table 之间创建关系。我得到同样的错误
由于 category
将是您从 titles
中查找 table,因此您需要在 category
上创建一个引用外键的索引。它们都需要是相同的数据类型(通常是 INT
,尽管在某些情况下有时您可以使用 CHAR(2)
变量,但通常不是必需的)。由于您只需要 6-8 个类别,因此我将其设置为 INT(1)
(或者可能 INT(2)
以确保安全)。
在这种情况下,您需要创建类似 categoryId
的东西,首先需要对其进行索引,然后连接到 category
上似乎不存在的外键;我不确定你想使用像 key
这样的术语。为什么不让 categoryId
成为 category
上的主键?这样,当您在 titles
上创建具有相同名称的外键时,它应该 link 正常。
编辑:
澄清一下,在 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`);
我正在尝试将外键添加到 Sequel Pro 中的 table(使用 UI)。
我有两个 table:"titles" 和 "categories",如下所示:
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;
我想创建一个外键,但我尝试的都不起作用。
类别 table 应该是一个简单的查找 table。我想从大约 6 - 8 个不同的选择中为每个标题分配一个类别。
最初我将类别字段设置为 tinytext,但我会收到错误消息:
"MySQL Error 1170 (42000): BLOB/TEXT Column Used in Key Specification Without a Key Length"。
在这里搜索发现你不能那样使用文本字段,所以我切换到 Varchar 并添加了 256 的长度。现在我得到:
MySQL 说:无法创建 table 'lit.#sql-2bf3_2'(错误号:150)。
如何为 table 创建外键?
在 Access 中,这很容易完成。 Access 以某种方式将 table 中的唯一键与查找相关联,但随后隐藏该键并改为显示文本字段。如何使用 Sequel Pro 和 MySQL 获得相似的结果?
编辑:
所以,澄清一下我现在所处的位置。我在标题 table(第一张图片)的类别字段上添加了一个索引。
我已将类别 table 中的 "key" 字段更改为类别 ID(第二张图片)。
但是,我似乎仍然无法在两个 table 之间创建关系。我得到同样的错误
由于 category
将是您从 titles
中查找 table,因此您需要在 category
上创建一个引用外键的索引。它们都需要是相同的数据类型(通常是 INT
,尽管在某些情况下有时您可以使用 CHAR(2)
变量,但通常不是必需的)。由于您只需要 6-8 个类别,因此我将其设置为 INT(1)
(或者可能 INT(2)
以确保安全)。
在这种情况下,您需要创建类似 categoryId
的东西,首先需要对其进行索引,然后连接到 category
上似乎不存在的外键;我不确定你想使用像 key
这样的术语。为什么不让 categoryId
成为 category
上的主键?这样,当您在 titles
上创建具有相同名称的外键时,它应该 link 正常。
编辑:
澄清一下,在 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`);