MySQL table de téléphone: Comment spécifier un numéro de contact principal unique par ID?
-
29-09-2019 - |
Question
Mon tableau suit comme:
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;
Je voudrais préciser pour chaque identifiant un numéro de contact principal. Je pensais à l'ajout d'une colonne booléenne, mais je ne peux pas comprendre comment l'obtenir pour permettre une seule valeur « true » par. id.
La solution
Vous avez essentiellement obtenu 3 options ...
- ont une colonne booléenne, mais il est à votre application pour le maintenir
- ont un nombre entier afin de stocker la priorité (0 = premier, 1 = secondaire, 2 = tertiaire, ...) encore une fois que vous aurez à maintenir
- Avoir une relation parent-enfant si un parent (technicien?) Disque a plusieurs enfants dossiers (numéro de téléphone). Le dossier parent contient alors également l'identifiant de l'enregistrement enfant primaire. Le seul bas-côté est que l'ajout de disques devient soit en plusieurs étapes (technicien ajouter, ajouter des numéros de téléphone, définissez le numéro de téléphone principal pour les techniciens) ou vous aurez besoin d'un DAL intelligent qui fait pour vous:)
Soit dit en passant, je suppose que vous en fait un moyen primaire par nombre TechnicianId non par PhoneId
Autres conseils
J'ajouter une clé étrangère de TECHNICIENS à dos TÉLÉPHONES:
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;
Cela crée une référence cyclique: techniciens références téléphones et téléphones techniciens références. Ceci est correct, mais il nécessite un traitement spécial quand vous faites des choses comme la suppression de tables, la restauration des sauvegardes, etc.
Utilisez une "échappatoire" dans MySQL. La documentation de MySQL dit :
Un index unique crée une contrainte de telle sorte que toutes les valeurs de l'indice doit être distincts. Une erreur se produit si vous essayez d'ajouter une nouvelle ligne avec une valeur de clé qui correspond à une ligne existante. Cette contrainte ne s'applique pas à NULL les valeurs sauf pour le stockage BDB moteur. Pour les autres moteurs, un UNIQUE index permet à plusieurs valeurs NULL pour des colonnes qui peuvent contenir NULL.
Cela signifie que vous pouvez créer une colonne booléenne qui a deux valeurs: true (ou 1) et NULL. Créer un index unique sur cette colonne + votre clé. Cela vous permet de ne définir un enregistrement à vrai, mais un certain nombre d'entre eux peuvent avoir NULL.