2015-04-19 6 views
1

Я пытаюсь добавить внешний ключ в таблицу в Sequel Pro (используя пользовательский интерфейс).Как добавить внешний ключ в таблицу в Sequel Pro?

У меня есть две таблицы: «заголовки» и «категории», как показано ниже:

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 Колонка Используется в Key спецификации без ключа Длина".

Искал здесь и обнаружил, вы не можете использовать текстовое поле, путь, поэтому я перешел на Varchar и добавил длиной 256. Теперь я получаю:

MySQL сказал: Невозможно создать таблицу «букв # sql-2bf3_2 '(errno: 150).

Как создать внешний ключ для моего стола?

В Access это довольно легко сделать. Как-то Access связывает уникальный ключ в таблице с поиском, но затем скрывает ключ и показывает вам текстовое поле. Как я могу получить аналогичный результат с Sequel Pro и MySQL?

EDIT:

Таким образом, чтобы уточнить это, где я нахожусь сейчас. Я добавил индекс в поле категории в таблице заголовков (первое изображение).

Я изменил поле «ключ» в таблице категорий на CategoryID (второе изображение).

Однако я все еще не могу создать связь между двумя таблицами. Я получаю ту же ошибку

So this is where I'm at right now.

enter image description here

+0

Ваш внешний ключ и его ссылка должны быть одного и того же типа. измените категорию на INT на заголовки и сначала проиндексируйте ее. – nomistic

ответ

2

Как category будет таблица подстановок прочь titles, вы должны были бы создать индекс category, который будет ссылаться на внешний ключ. Они оба должны были быть одинаковыми типами данных (обычно INT, хотя иногда вы могли использовать переменную CHAR(2) в некоторых случаях, но обычно это не обязательно). Поскольку вы ожидаете только 6-8 категорий, я бы сделал это INT(1) (или может быть INT(2), чтобы быть в безопасности).

В этом случае вам необходимо создать что-то вроде categoryId, которое сначала необходимо проиндексировать, а затем подключиться к внешнему ключу по category, который, как представляется, не существует; Я не уверен, что вы хотите использовать такой термин, как key. Почему бы не просто сделать categoryId основным ключом на category? таким образом, когда вы создаете внешний ключ на titles с тем же именем, он должен хорошо связываться.

Edit:

Чтобы прояснить немного, после того как вы создали categoryID на category вы можете сделать это под titles

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

Edit:

Вот модификация, используя свой оригинальный макет. это должно сработать для вас:

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`); 
+0

Нужен ли мне индекс в поле категории в таблице титров? Я изменил ключевое поле на categoryID (что кажется очевидным выбором), но я все еще не могу соединить эти две таблицы. –

+0

есть. Чтобы иметь возможность использовать внешний ключ, ссылочный ключ должен быть индексом. – nomistic

+0

Обратите внимание, что типы данных также должны быть одинаковыми. У вас он установлен как varchar на 'titles'. Это должен быть INT – nomistic

 Смежные вопросы

  • Нет связанных вопросов^_^