Comment puis-je ajouter des clés étrangères à deux tables Innob afin qu'elles se mettent à jour automatiquement?
-
05-07-2019 - |
Question
J'ai deux tables utilisateurs et lead_contacts qui ont des données similaires. Lorsque quelqu'un achète un produit, il devient un utilisateur. Comment dois-je modifier les deux staements de création ci-dessous afin:
- que la table des leads reçoive un nouveau entrée avec prenom, nom, entreprise et adresse électronique lorsqu'un utilisateur est créé.
-
le nom, le nom, la société et l'adresse électronique de la table des utilisateurs sont mis à jour automatiquement lorsque les informations de la table des leads sont modifiées
CREATE TABLE
lead_contacts
(
contact_id
int (11) NON NULL auto_increment,
user_id
int (11) non signé NOT NULL par défaut '0',
email
varchar (100) NOT NULL par défaut '',
société
varchar (50) NOT NULL default '',
prénom
varchar (50) NOT NULL par défaut '',
dernier nom
varchar (50) NOT NULL par défaut '',
adresse
varchar (100) NOT NULL default '',
address_2
varchar (100) NOT NULL par défaut '',
ville
varchar (50) NON NULL par défaut '',
state
varchar (50) NON NULL par défaut '',
pays
varchar (50) NON NULL par défaut '',
code_postal
varchar (30) NOT NULL par défaut '',
phone
varchar (30) NON NULL par défaut '',
fax
varchar (30) NON NULL par défaut '',
ship_bill_same
enum ('Y', 'N') NOT NULL par défaut 'Y',
notes
texte NOT NULL,
admin_notes
text NOT NULL,
nom_liste
varchar (50) NOT NULL par défaut '',
lead_list
int (11) non signé NOT NULL par défaut '0',
is_master_list
énumération ('N', 'Y') NON NULL par défaut 'N',
active_work
enum ('Y', 'N') NOT NULL par défaut 'Y',
parentID
int (11) non signé NOT NULL par défaut '0',
PRIMARY KEY (contact_id
),
KEYid_utilisateur
(id_utilisateur
),
KEYlead_list
(lead_list
),
KEYis_master_list
(is_master_list
),
KEYactive_work
(active_work
),
KEYparentID
(parentID
)
) ENGINE = InnoDB DEFAULT CHARSET = latin1 PACK_KEYS = 1;CREATE TABLE
utilisateurs
(
ID utilisateur
int (11) NON NULL auto_increment,
access_level
int (11) NON NULL par défaut '0',
nom d'utilisateur
varchar (100) NOT NULL default '',
mot de passe
varchar (100) NOT NULL default '',
prénom
varchar (50) NOT NULL par défaut '',
dernier nom
varchar (50) NOT NULL par défaut '',
société
varchar (100) NOT NULL default '',
email
varchar (100) NOT NULL par défaut '',
PRIMARY KEY (ID utilisateur
),
UNIQUE KEYnom d'utilisateur
(nom d'utilisateur
)
) ENGINE = InnoDB DEFAULT CHARSET = latin1;
La solution
Je pense que vous comprenez mal le fonctionnement des clés étrangères.
Une référence de leads aux utilisateurs signifie qu'une ligne doit déjà exister chez les utilisateurs avant qu'une ligne de leads puisse la référencer.
SQL ne permet pas à une table dépendante de créer automatiquement une ligne dans sa table parent à la demande.
Vous pouvez le faire avec un déclencheur, je suppose. Mais pas une contrainte de clé étrangère. En outre, les valeurs à renseigner dans la table parente doivent provenir de quelque part. Vous devez les spécifier dans une instruction INSERT de votre application ou dans un déclencheur, ou bien utiliser les valeurs par défaut définies pour chaque colonne de la table users. Étant donné que vous avez une contrainte unique sur users.username
, je ne pense pas que cela soit possible à partir d'un déclencheur.
Objet: votre question de suivi dans le commentaire:
Non, une clé étrangère ne peut pas faire ce que vous décrivez. Lorsque vous modifiez des informations dans la table leads
(la table avec la clé étrangère), la seule opération qu'une clé étrangère peut faire est d'empêcher la modification si vous essayez de modifier < code> leads.user_id à une valeur introuvable dans la table users
.
La clé étrangère de la table enfant ( leads
) ne peut rien modifier dans la table parent ( utilisateurs
).
Je ne sais pas quelle est la source de votre compréhension erronée. L'avez-vous lu quelque part ou avez-vous vu quelqu'un faire quelque chose comme ça?