MySQL table de téléphone: Comment spécifier un numéro de contact principal unique par ID?

StackOverflow https://stackoverflow.com/questions/3498236

  •  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.

Était-ce utile?

La solution

Vous avez essentiellement obtenu 3 options ...

  1. ont une colonne booléenne, mais il est à votre application pour le maintenir
  2. ont un nombre entier afin de stocker la priorité (0 = premier, 1 = secondaire, 2 = tertiaire, ...) encore une fois que vous aurez à maintenir
  3. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top