Come faccio ad aggiungere chiavi esterne a due tabelle Innob in modo che si aggiornino automaticamente?

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

Domanda

Ho due tabelle utenti e lead_contacts che hanno dati simili. Quando qualcuno acquista un prodotto diventa un utente. Come devo modificare le due creazioni di seguito così:

  • che la tabella dei lead riceve un nuovo voce con first_name, last_name, company ed e-mail, quando viene creato un utente.
  • nome, cognome, azienda ed e-mail nella tabella degli utenti vengono aggiornati automaticamente quando le informazioni sulla tabella dei lead vengono modificate

    CREA TABELLA lead_contacts (
       contact_id int (11) NOT NULL auto_increment,
    user_id int (11) unsigned NOT NULL default '0',
    email varchar (100) NOT NULL default '',
    company varchar (50) NOT NULL default '',
    first_name varchar (50) NOT NULL default '',
    last_name varchar (50) NOT NULL default '',
    address varchar (100) NOT NULL default '',
    address_2 varchar (100) NOT NULL default '',
    city varchar (50) NOT NULL default '',
    state varchar (50) NOT NULL default '',
    country varchar (50) NOT NULL default '',
    Postal_code varchar (30) NOT NULL default '',
    phone varchar (30) NOT NULL default '',
    fax varchar (30) NOT NULL default '',
    ship_bill_same enum ('Y', 'N') NOT NULL default 'Y',
    note testo NOT NULL,
    admin_notes testo NOT NULL,
    list_name varchar (50) NOT NULL default '',
    lead_list int (11) unsigned NOT NULL default '0',
    is_master_list enum ('N', 'Y') NOT NULL default 'N',
    active_work enum ('Y', 'N') NOT NULL default 'Y',
    parentID int (11) unsigned NOT NULL default '0',
    CHIAVE PRIMARIA ( contact_id ),
    KEY user_id ( user_id ),
    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;

    CREA TABELLA utenti (
    userID int (11) NOT NULL auto_increment,
    access_level int (11) NOT NULL default '0',
    username varchar (100) NOT NULL default '',
    password varchar (100) NOT NULL default '',
    first_name varchar (50) NOT NULL default '',
    last_name varchar (50) NOT NULL default '',
    company varchar (100) NOT NULL default '',
    email varchar (100) NOT NULL default '',
    CHIAVE PRIMARIA ( userID ),
    UNIQUE KEY nome utente ( nome utente )
    ) ENGINE = InnoDB DEFAULT CHARSET = latin1;

È stato utile?

Soluzione

Penso che tu fraintenda come funzionano le chiavi esterne.

Un riferimento da lead agli utenti significa che una riga deve già esistere negli utenti prima che una riga in lead possa fare riferimento a essa.

In SQL non c'è modo di fare in modo che una tabella dipendente crei automaticamente una riga nella sua tabella padre su richiesta.

Potresti farlo con un grilletto, suppongo. Ma non un vincolo di chiave esterna. Inoltre, i valori da compilare nella tabella padre devono provenire da qualche parte. O è necessario specificarli in un'istruzione INSERT nell'applicazione o in un trigger, oppure utilizzare i valori predefiniti definiti per ogni colonna nella tabella degli utenti. Dato che hai un vincolo univoco su users.username , non credo che ciò sarebbe possibile da un trigger.


Ri: la tua domanda di follow-up nel commento:

No, una chiave esterna non può fare quello che stai descrivendo. Quando modifichi le informazioni nella tabella lead (la tabella con la chiave esterna), la unica cosa può fare una chiave esterna è impedire la modifica se provi a cambiare < code> lead.user_id su un valore che non si trova nella tabella utenti .

La chiave esterna nella tabella figlio ( lead ) non può cambiare nulla nella tabella padre ( utenti ).

Non sono sicuro di quale sia la fonte della tua comprensione errata. L'hai letto da qualche parte o hai visto qualcuno fare qualcosa del genere?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top