MySQL Phone table: Как указать уникальный основной контактный номер для каждого идентификатора? - PullRequest
1 голос
/ 17 августа 2010

Моя таблица выглядит следующим образом:

CREATE TABLE IF NOT EXISTS PHONES (
    number VARCHAR(10),
    id INT,
    type VARCHAR(10),
    PRIMARY KEY (number),
    FOREIGN KEY (id)
        REFERENCES TECHNICIANS(id)
        ON DELETE CASCADE
) ENGINE = INNODB;

Я хотел бы указать для каждого идентификатора один основной контактный номер.Я думал о добавлении логического столбца, но я не могу понять, как заставить его разрешить только одно «истинное» значение на.ID.

Ответы [ 3 ]

2 голосов
/ 17 августа 2010

Я бы добавил внешний ключ от TECHNICIANS обратно к ТЕЛЕФОНАМ:

ALTER TABLE TECHNICIANS
  ADD COLUMN primary_number VARCHAR(10),
  ADD CONSTRAINT FOREIGN KEY (primary_number) REFERENCES PHONES (number)
    ON UPDATE CASCADE
    ON DELETE SET NULL;

Это создает циклический справочник: техники ссылаются на телефоны, а телефоны - на техников.Это нормально, но требует особой обработки, когда вы делаете такие вещи, как удаление таблиц, восстановление резервных копий и т. Д.

1 голос
/ 17 августа 2010

Используйте «лазейку» в MySQL. Документация MySQL говорит :

УНИКАЛЬНЫЙ индекс создает ограничение так что все значения в индексе должны быть отличным Ошибка возникает, если вы попробуйте добавить новую строку со значением ключа это соответствует существующей строке. это ограничение не относится к NULL значения, кроме хранилища BDB двигатель. Для других двигателей УНИКАЛЬНО Индекс допускает несколько значений NULL для столбцы, которые могут содержать NULL.

Это означает, что вы можете создать логический столбец, который имеет два значения: true (или 1) и NULL. Создайте УНИКАЛЬНЫЙ индекс по этому столбцу + ваш ключ. Это позволяет установить только одну запись в true, но любое количество из них может иметь значение NULL.

1 голос
/ 17 августа 2010

У вас есть три варианта ...

  1. имеет логический столбец, но ваше приложение поддерживает его
  2. имеет целое число, поэтому вы сохраняете приоритет (0 = простое, 1 = вторичное, 2 = третичное, ...), и вам придется его поддерживать
  3. Имейте отношения родителя-ребенка, поэтому родительская (техническая?) Запись имеет несколько дочерних (номер телефона) записей. Тогда родительская запись также будет содержать идентификатор основной дочерней записи. Единственным недостатком является то, что добавление записей становится многоэтапным (добавление техника, добавление номеров телефонов, установка основного номера телефона для специалиста), или вам понадобится интеллектуальный DAL, который сделает это за вас:)

Между прочим, я предполагаю, что вы на самом деле имеете в виду один первичный номер для каждого специалиста, а не для номера телефона

...