Как добавить внешние ключи в две таблицы Innob, чтобы они автоматически обновляли друг друга? - PullRequest
0 голосов
/ 17 июня 2009

У меня есть две таблицы users и lead_contacts, которые имеют схожие данные. Когда кто-то покупает продукт, он становится пользователем. Как мне изменить две создаваемые позиции так:

  • что таблица потенциальных клиентов получает новый запись с именем, фамилией, компанией и адресом электронной почты при создании пользователя.
  • имя, фамилия, компания и адрес электронной почты в таблице пользователей обновлены автоматически при изменении информации в таблице отведений

    CREATE TABLE lead_contacts (
    contact_id int (11) NOT NULL auto_increment,
    user_id int (11) без знака NOT NULL по умолчанию '0',
    email varchar (100) NOT NULL default '',
    company varchar (50) NOT NULL default '',
    first_name varchar (50) NOT NULL по умолчанию '',
    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 по умолчанию '',
    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 по умолчанию 'Y',
    notes текст НЕ НУЛЬ,
    admin_notes текст НЕ НУЛЬ,
    list_name varchar (50) NOT NULL default '',
    lead_list int (11) без знака NOT NULL по умолчанию '0',
    is_master_list enum ('N', 'Y') NOT NULL по умолчанию 'N',
    active_work enum ('Y', 'N') NOT NULL по умолчанию 'Y',
    parentID int (11) без знака NOT NULL по умолчанию '0',
    ПЕРВИЧНЫЙ КЛЮЧ (contact_id),
    КЛЮЧ user_id (user_id),
    КЛЮЧ lead_list (lead_list),
    КЛЮЧ is_master_list (is_master_list),
    КЛЮЧ active_work (active_work),
    КЛЮЧ parentID (parentID)
    ) ENGINE = InnoDB CHARSET ПО УМОЛЧАНИЮ = latin1 PACK_KEYS = 1;

    CREATE TABLE users (
    userID int (11) NOT NULL auto_increment,
    access_level int (11) NOT NULL по умолчанию '0',
    username varchar (100) NOT NULL по умолчанию '',
    password varchar (100) NOT NULL default '',
    first_name varchar (50) NOT NULL по умолчанию '',
    last_name varchar (50) NOT NULL default '',
    company varchar (100) NOT NULL default '',
    email varchar (100) NOT NULL default '',
    ПЕРВИЧНЫЙ КЛЮЧ (userID),
    УНИКАЛЬНЫЙ КЛЮЧ username (username)
    ) ENGINE = InnoDB CHARSET ПО УМОЛЧАНИЮ = latin1;

1 Ответ

3 голосов
/ 17 июня 2009

Я думаю, вы неправильно понимаете, как работают внешние ключи.

Ссылка от потенциальных клиентов до пользователей означает, что строка уже должна существовать у пользователей, прежде чем строка в потенциальных клиентах сможет ссылаться на нее.

В SQL нет способа заставить зависимую таблицу автоматически создавать строку в своей родительской таблице по требованию.

Полагаю, вы могли бы сделать это с помощью триггера. Но не ограничения внешнего ключа. Кроме того, значения для заполнения в родительской таблице должны откуда-то приходить. Либо вам нужно указать их в операторе INSERT в вашем приложении или в триггере, либо использовать значения по умолчанию, определенные для каждого столбца в таблице пользователей. Учитывая, что у вас есть уникальное ограничение на users.username, я не думаю, что это было бы возможно из-за триггера.


Re: ваш следующий вопрос в комментарии:

Нет, внешний ключ не может делать то, что вы описываете. Когда вы изменяете информацию в таблице leads (таблица с внешним ключом), то, что может сделать внешний ключ only , это предотвратить модификацию, если вы попытаетесь изменить столбец leads.user_id на значение это не найдено в таблице users.

Внешний ключ в дочерней (leads) таблице не может ничего изменить в родительской (users) таблице.

Я не уверен, что является источником вашего ошибочного понимания. Вы где-то читали или видели, как кто-то делает что-то подобное?

...