Как мне добавить внешние ключи к двум таблицам Innob, чтобы они автоматически обновляли друг друга?
-
05-07-2019 - |
Вопрос
У меня есть две таблицы 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
) таблица.
Я не уверен, что является источником вашего ошибочного понимания.Вы где-нибудь читали это или видели, как кто-то делал что-то подобное?