Можно ли создать внешний ключ из столбца типа ENUM? - PullRequest
0 голосов
/ 07 марта 2020

У меня есть следующий код, и я хочу создать внешнюю ссылку между столбцами, называемыми «tipo»:

CREATE TABLE IF NOT EXISTS preferencias(
DNIusuario VARCHAR(9) NOT NULL,
tipo ENUM("Paseo", "Gastronomia", "Deporte interior", "Deporte exterior", "Cultura", "Arte", "Naturaleza", "Cine", "Musica", "Fiesta", "Terraceo", "Compras") NOT NULL,
obligatoria BIT,
ultimaactividad DATE,
PRIMARY KEY(DNIusuario,tipo), 
FOREIGN KEY (DNIusuario) REFERENCES registros(DNI)
);

CREATE TABLE IF NOT EXISTS citas(
IDcita INT AUTO_INCREMENT PRIMARY KEY,
fechacita DATE,
lugarcita VARCHAR(25),
tipo ENUM("Paseo", "Gastronomia", "Deporte interior", "Deporte exterior", "Cultura", "Arte", "Naturaleza", "Cine", "Musica", "Fiesta", "Terraceo", "Compras") NOT NULL,
resultado SET("1","2","3","4","5"),
FOREIGN KEY (tipo) REFERENCES preferencias(tipo)
);

При создании таблиц по отдельности (без ограничения внешнего ключа) они работают просто хорошо. Все мои зарубежные ссылки в этой базе данных тоже работают нормально. Однако при попытке создать ограничение внешнего ключа для значений типа ENUM я получаю следующее сообщение об ошибке:

ОШИБКА 1215 (HY000): Невозможно добавить ограничение внешнего ключа

Итак, мои дорогие друзья ... что делать?

1 Ответ

0 голосов
/ 07 марта 2020

Да, если вы объявите это правильно. Это означает, что вы ссылаетесь на весь первичный ключ, поэтому вам нужно DNIusuario:

CREATE TABLE IF NOT EXISTS citas(
    IDcita INT AUTO_INCREMENT PRIMARY KEY,
    fechacita DATE,
    lugarcita VARCHAR(25),
    tipo ENUM("Paseo", "Gastronomia", "Deporte interior", "Deporte exterior", "Cultura", "Arte", "Naturaleza", "Cine", "Musica", "Fiesta", "Terraceo", "Compras") NOT NULL,
    resultado SET("1","2","3","4","5"),
    DNIusuario VARCHAR(9),
    FOREIGN KEY (DNIusuario, tipo) REFERENCES preferencias(DNIusuario, tipo)
);

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

  • Создать таблицу tipos с автоматически увеличивающимся столбцом и именем tipo - и, возможно, другой информацией.
  • Измените существующие таблицы, чтобы они имели автоматически увеличиваемый столбец, который будет служить первичным ключом. Затем используйте это для ссылок из других таблиц.
  • Также используйте одинарные кавычки для строковых констант, а не двойные кавычки. Одиночные кавычки являются стандартом базы данных, и во многих базах данных двойные кавычки предназначены для цитирования идентификаторов, не разделяющих строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...