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

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

Вопрос

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

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

    СОЗДАТЬ ТАБЛИЦУ lead_contacts (
    contact_id int(11) НЕНУЛЕВОЕ авто_инкрементирование,
    user_id int(11) без знака NOT NULL по умолчанию '0',
    email varchar(100) ПО умолчанию НЕ равен нулю ",
    company varchar(50) ПО умолчанию НЕ равен нулю ",
    first_name varchar(50) ПО умолчанию НЕ равен нулю ",
    last_name varchar(50) ПО умолчанию НЕ равен нулю ",
    address varchar(100) ПО умолчанию НЕ равен нулю ",
    address_2 varchar(100) ПО умолчанию НЕ равен нулю ",
    city varchar(50) ПО умолчанию НЕ равен нулю ",
    state varchar(50) ПО умолчанию НЕ равен нулю ",
    country varchar(50) ПО умолчанию НЕ равен нулю ",
    postal_code varchar(30) ЗНАЧЕНИЕ по умолчанию НЕ равно нулю ",
    phone varchar(30) ЗНАЧЕНИЕ по умолчанию НЕ равно нулю ",
    fax varchar(30) ЗНАЧЕНИЕ по умолчанию НЕ равно нулю ",
    ship_bill_same перечисление('Y', 'N') НЕ равно НУЛЮ по умолчанию 'Y',
    notes текст НЕ РАВЕН НУЛЮ,
    admin_notes текст НЕ РАВЕН НУЛЮ,
    list_name varchar(50) ПО умолчанию НЕ равен нулю ",
    lead_list int(11) без знака NOT NULL по умолчанию '0',
    is_master_list перечисление('N', 'Y') НЕ равно НУЛЮ по умолчанию 'N',
    active_work перечисление('Y', 'N') НЕ равно НУЛЮ по умолчанию '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)
    ) ДВИЖОК= КОДИРОВКА InnoDB ПО УМОЛЧАНИЮ=latin1 PACK_KEYS=1;

    СОЗДАТЬ ТАБЛИЦУ users (
    userID int(11) НЕНУЛЕВОЕ авто_инкрементирование,
    access_level int(11) NOT NULL по умолчанию '0',
    username varchar(100) ПО умолчанию НЕ равен нулю ",
    password varchar(100) ПО умолчанию НЕ равен нулю ",
    first_name varchar(50) ПО умолчанию НЕ равен нулю ",
    last_name varchar(50) ПО умолчанию НЕ равен нулю ",
    company varchar(100) ПО умолчанию НЕ равен нулю ",
    email varchar(100) ПО умолчанию НЕ равен нулю ",
    ПЕРВИЧНЫЙ КЛЮЧ (userID),
    УНИКАЛЬНЫЙ КЛЮЧ username (username)
    ) ДВИЖОК= КОДИРОВКА InnoDB ПО УМОЛЧАНИЮ=latin1 ;

Это было полезно?

Решение

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

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

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

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


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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top