كيف أقوم بإضافة مفاتيح خارجية إلى جدولي Innob بحيث يتم تحديث بعضهما البعض تلقائيًا؟
-
05-07-2019 - |
سؤال
لدي جدولين للمستخدمين وlead_contacts لهما بيانات مماثلة.عندما يشتري شخص ما منتجًا فإنه يصبح مستخدمًا.كيف يمكنني تعديل عنصري الإنشاء أدناه بحيث:
- يتلقى جدول Leads إدخالًا جديدًا مع First_Name و Last_Name و Company والبريد الإلكتروني ، عند إنشاء مستخدم.
يتم تحديث جدول First_Name ، Last_Name ، الشركة والبريد الإلكتروني في المستخدمين تلقائيًا عند تغيير معلومات جدول العملاء
اصنع جدول
lead_contacts
(
contact_id
كثافة العمليات (11) ليست فارغة auto_increment،
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 DEFAULT CHARSET=latin1 PACK_KEYS=1;اصنع جدول
users
(
userID
كثافة العمليات (11) ليست فارغة auto_increment،
access_level
int(11) ليس فارغًا افتراضيًا "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 ;
المحلول
أعتقد أنك تسيء فهم كيفية عمل المفاتيح الخارجية.
المرجع من العملاء المتوقعين إلى المستخدمين يعني أن الصف يجب أن يكون موجودًا بالفعل لدى المستخدمين قبل أن يتمكن صف في العملاء المتوقعين من الرجوع إليه.
لا توجد طريقة في SQL لجعل الجدول التابع يقوم تلقائيًا بإنشاء صف في الجدول الأصلي عند الطلب.
أفترض أنه يمكنك القيام بذلك باستخدام الزناد.ولكن ليس قيود المفتاح الخارجي.علاوة على ذلك، فإن القيم المطلوب ملؤها في الجدول الأصلي يجب أن تأتي من مكان ما.إما أنك بحاجة إلى تحديدها في عبارة INSERT في التطبيق الخاص بك أو في المشغل، أو استخدم الإعدادات الافتراضية المحددة لكل عمود في جدول المستخدمين.نظرًا لأن لديك قيدًا فريدًا على users.username
, ، لا أعتقد أن هذا سيكون ممكنًا من خلال الزناد.
يكرر:سؤالك التالي في التعليق:
لا، لا يمكن للمفتاح الخارجي أن يفعل ما تصفه.عندما تقوم بتعديل المعلومات في leads
الجدول (الجدول مع المفتاح الخارجي)، و فقط الشيء الذي يمكن أن يفعله المفتاح الخارجي هو منع التعديل إذا حاولت تغيير ملف leads.user_id
عمود إلى قيمة غير موجودة في users
طاولة.
المفتاح الخارجي في الطفل (leads
) لا يمكن للجدول تغيير أي شيء في الأصل (users
) طاولة.
لا أعرف ما هو مصدر فهمك الخاطئ.هل قرأته في مكان ما أو رأيت شخصًا يفعل شيئًا كهذا؟