كيف أقوم بإضافة مفاتيح خارجية إلى جدولي Innob بحيث يتم تحديث بعضهما البعض تلقائيًا؟

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

سؤال

لدي جدولين للمستخدمين و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) طاولة.

لا أعرف ما هو مصدر فهمك الخاطئ.هل قرأته في مكان ما أو رأيت شخصًا يفعل شيئًا كهذا؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top