¿Cómo agrego claves externas a dos tablas Innob para que se actualicen automáticamente?
-
05-07-2019 - |
Pregunta
Tengo dos tablas de usuarios y leads_contacts que tienen datos similares. Cuando alguien compra un producto, se convierte en usuario. ¿Cómo debo modificar las dos declaraciones de creación a continuación?
- que la tabla de leads recibe un nuevo entrada con nombre, apellido, compañía y correo electrónico, cuando se crea un usuario.
-
se actualiza el nombre, apellido, compañía y correo electrónico en la tabla de usuarios automáticamente cuando se cambia la información de la tabla de clientes potenciales
CREATE TABLE
lead_contacts
(
contact_id
int (11) NOT NULL auto_increment,
user_id
int (11) unsigned NOT NULL predeterminado '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 predeterminado 'Y',
notes
text NOT NULL,
admin_notes
text NOT NULL,
list_name
varchar (50) NOT NULL default '',
lead_list
int (11) unsigned NOT NULL predeterminado '0',
is_master_list
enum ('N', 'Y') NOT NULL predeterminado 'N',
active_work
enum ('Y', 'N') NOT NULL predeterminado 'Y',
parentID
int (11) unsigned NOT NULL predeterminado '0',
CLAVE PRIMARIA (contact_id
),
CLAVEuser_id
(user_id
),
CLAVElead_list
(lead_list
),
CLAVEis_master_list
(is_master_list
),
TECLAactive_work
(active_work
),
CLAVEparentID
(parentID
)
) ENGINE = InnoDB CHARSET POR DEFECTO = latin1 PACK_KEYS = 1;CREATE TABLE
usuarios
(
userID
int (11) NOT NULL auto_increment,
access_level
int (11) NOT NULL predeterminado '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 '',
CLAVE PRIMARIA (userID
),
CLAVE ÚNICAusername
(username
)
) ENGINE = InnoDB DEFAULT CHARSET = latin1;
Solución
Creo que no entiendes cómo funcionan las claves externas.
Una referencia de clientes potenciales a usuarios significa que ya debe existir una fila en los usuarios antes de que una fila en clientes potenciales pueda hacer referencia a ella.
No hay forma en SQL de hacer que una tabla dependiente cree automáticamente una fila en su tabla principal a pedido.
Podrías hacer esto con un gatillo, supongo. Pero no es una clave extranjera restricciones. Además, los valores para completar la tabla principal deben provenir de algún lugar. Debe especificarlos en una instrucción INSERT en su aplicación o en un desencadenador, o bien usar los valores predeterminados definidos para cada columna en la tabla de usuarios. Dado que tiene una restricción única en users.username
, no creo que esto sea posible desde un disparador.
Re: su pregunta de seguimiento en el comentario:
No, una clave externa no puede hacer lo que estás describiendo. Cuando modifica la información en la tabla leads
(la tabla con la clave externa), lo único que puede hacer una clave externa es evitar la modificación si intenta cambiar la < code> leads.user_id a un valor que no se encuentra en la tabla users
.
La clave externa en la tabla secundaria ( leads
) no puede cambiar nada en la tabla primaria ( users
).
No estoy seguro de cuál es la fuente de su comprensión errónea. ¿Lo leíste en alguna parte o viste a alguien hacer algo como esto?