2016-07-15 3 views
2

Я хорошо искал и не могу найти ответ, хорошо объясняющий проблему. Вот упрощенный пример моей проблемы. Предположим, у меня есть таблица test с двумя полями first и second. Я делаю first основным ключом и хочу second ссылаться на first и каскадом на обновление. Это позволит мне составить список строк, зная, какая строка появляется после каждой строки, если только «голова».Внешний ключ, ссылающийся на тот же стол

Создание таблицы прекрасно работает, однако, когда я пытаюсь добавить строку, она жалуется, что ограничение внешнего ключа с каскадным обновлением не удалось. Это имеет смысл, поскольку я оставил second как null. Поэтому я думал, что я мог вставить две строки, а затем добавить внешний ключ:

  1. first: a second: b
  2. first: b second: a

Это было успешным. Затем я попытался обновить строку 1, чтобы иметь значение firstc. Однако это не помогло, заявив, что внешний ключ не удался. Зачем? Разве это не должно быть следующим?

  1. first: c second: b
  2. first: b second: c

Моя единственная догадка о существовании круговых обновлений с обновлением к строке 1 каскадных к строке 2, каскадной обратно в строке 1, но это не должно произойти! Нет ничего, ссылающегося на second, поэтому обновление должно просто каскадироваться до строки 2 и останавливаться. Пожалуйста, помогите, это сводит меня с ума.

Редактировать: В соответствии с запросом, вот мой show create table test.

CREATE TABLE `test` (
`first` varchar(32) NOT NULL, 
`second` varchar(32) NOT NULL, 
PRIMARY KEY (`first`), 
KEY `fk` (`second`), 
CONSTRAINT `fk` FOREIGN KEY (`second`) REFERENCES `test` (`first`) ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

ответ

0

Я думаю, что проблема заключается в структуре столбцов:

  • первичный ключ не может быть нулевым
  • и ваш столбец ссылок позволил нулевое значение (не допускается, если ссылка на столбец не null)

Поэтому убедитесь, что у вас есть оба столбца с одинаковым типом данных, одна и та же кодировка, а не нуль.

Обновление: проблема в том, что внешний ключ и ссылочный ключ находятся в одной таблице, я протестировал ее с другой таблицей, и она сработала.

+0

Первичный ключ не является нулевым, так как это будет c для строки 1 и b для второй строки. Кроме того, столбец ссылок не будет иметь нулевого значения. Это будет b для первой строки и c для второй строки. –

+1

не будет иметь нулевого значения, но? пожалуйста, вы можете вставить 'show create table test', чтобы увидеть структуру. спасибо –

+0

Определенно, отредактировал мой вопрос с результатами. –

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