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 ),
    CLAVE user_id ( user_id ),
    CLAVE lead_list ( lead_list ),
    CLAVE is_master_list ( is_master_list ),
    TECLA active_work ( active_work ),
    CLAVE parentID ( 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 ÚNICA username ( username )
    ) ENGINE = InnoDB DEFAULT CHARSET = latin1;

¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top