2017-04-12 1 views
0

je le scénario suivant: Une table enfant « téléphone » peut servir plusieurs tables de parents se joignent par des tableaux, comme suit:« attribut propriétaire appartenant à » la contrainte unique se joindre par la table

enter image description here

CREATE TABLE phone (

    id BIGINT AUTO_INCREMENT, 
    number VARCHAR(16) NOT NULL, 
    type VARCHAR(16) NOT NULL, 

    PRIMARY KEY(id)  

); 

CREATE TABLE employee_phone (

    id BIGINT AUTO_INCREMENT, 
    employee BIGINT NOT NULL, 
    phone BIGINT NOT NULL, 

    PRIMARY KEY(id), 
    CONSTRAINT empl_phone_u_phone UNIQUE(phone), 
    CONSTRAINT empl_phone_fk_employee 
     FOREIGN KEY(employee) 
     REFERENCES employee(id) ON DELETE CASCADE, 
    CONSTRAINT empl_phone_fk_phone 
     FOREIGN KEY(phone) 
     REFERENCES phone(id) ON DELETE CASCADE 

); 

Laissez Alice et Bob vivre dans la même maison et être des employés de la même entreprise. HR a deux numéros de téléphone enregistrés pour Alice alors qu'ils n'en ont qu'un pour Bob, le numéro de téléphone fixe de la maison. Existe-t-il un moyen d'imposer au niveau de la base de données qu'un numéro de téléphone (type de numéro) ne peut pas être répété pour le même employé (ou le fournisseur, ou tout parent apparaissant plus tard) utilisant cette configuration? Ou devrais-je prendre en charge de telles restrictions dans la couche application? Je préfère ne pas utiliser de déclencheurs ou de dénormalisation de table (comme vu dans les questions connexes sur le site comme this one, qui fonctionnent avec des ID, pas avec d'autres champs), mais je suis ouvert à le faire s'il n'y a pas d'alternative. J'utilise MySQL. Merci de votre attention.

+0

Je suis confus. Est-ce que ça va pour Alice et Bob d'avoir le même numéro de téléphone? –

+0

@GordonLinoff Oui, c'est. Ils peuvent être un couple vivant dans la même maison, par exemple. Les RH ont besoin d'un numéro de téléphone pour chacun. – jpangamarca

Répondre

0

Si je comprends bien, vous voulez juste des contraintes uniques sur les tables de jonction:

alter table employee_phone add constraint unq_employeephone_employee_phone unique (employee, phone); 

Cela permettra d'éviter les doublons pour un employé donné ou (avec la contrainte équivalente) fournisseur.

Si vous voulez que tous les numéros de téléphone pour être unique dans la table phone, puis il suffit de mettre une contrainte/index unique sur phone:

alter table phone add constraint unq_phone_phone unique (phone); 

(vous pourriez vouloir inclure le type aussi bien).

Si vous essayez d'ajouter un téléphone en double, le code renverra une erreur.

+0

Merci. Malheureusement, les numéros de téléphone en double sont un cas possible et ne peuvent pas être appliquées pour être unique. C'est pourquoi la contrainte unique dans la table jointe ne couvre que la colonne téléphonique (voir mon premier commentaire dans la question). – jpangamarca

+0

@jpangamarca. . . La contrainte unique dans la table 'join' sur les colonnes employee et phone fait exactement ce que vous dites:" pour appliquer au niveau de la base de données qu'un numéro de téléphone (type de numéro) ne peut pas être répété pour le même employé (ou fournisseur , ou n'importe quel parent apparaît plus tard) ". –

+0

Je suis désolé, je ne suis pas assez clair. Oui, la contrainte fonctionne comme ça pour les ID, mais ce dont j'ai besoin, c'est d'interdire deux numéros identiques (type numérique, oublions les ID) pour le même employé mais d'avoir le même type de numéro pour un autre employé. Je ne peux pas avoir de contraintes uniques dans la table de téléphone. Suis-je clair maintenant? – jpangamarca