Comment puis-je ajouter des clés étrangères à deux tables Innob afin qu'elles se mettent à jour automatiquement?

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

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 ),
    KEY id_utilisateur ( id_utilisateur ),
    KEY lead_list ( lead_list ),
    KEY is_master_list ( is_master_list ),
    KEY active_work ( active_work ),
    KEY parentID ( 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 KEY nom d'utilisateur ( nom d'utilisateur )
    ) ENGINE = InnoDB DEFAULT CHARSET = latin1;

Était-ce utile?

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?

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