Come faccio ad aggiungere chiavi esterne a due tabelle Innob in modo che si aggiornino automaticamente?
-
05-07-2019 - |
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
),
KEYuser_id
(user_id
),
KEYlead_list
(lead_list
),
KEYis_master_list
(is_master_list
),
KEYactive_work
(active_work
),
KEYparentID
(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 KEYnome utente
(nome utente
)
) ENGINE = InnoDB DEFAULT CHARSET = latin1;
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?