هل عند حذف سجل من ماستر, السجلات المرتبطة معه في الديتال تحذف مباشرة
#1
السلام عليكم و رحمة الله و بركاته

عندي جدولان في قاعدة البيانات أحدهما ماستر و الثاني ديتال

و لقد و ضعت هذه الرابطة بين الجدولين في الدلفي

فهل عند حذف سجل من الماستر أكون قد تخلصت من السجلات المرتبطة معه في جدول الديتال

أو يجب أن أحذفها تباعا(فإن كانت كذلك فما هي أفضل طريقة)

شكر كبير لهذا المنتدى و لكل أعضائه.
الرد
#2
و عليكم السلام

إن فهمت جيدا سؤالك فهذا يتعلق بنوع الحقل هل هو أولي أم ثانوي
أدبني الدهر فأراني نقص عقلي وإذا ما ازددت علما زادني علما بجهلي
الرد
#3
نعم الحقل أولي.
الرد
#4
السلام عليكم...

إذا كانت العلاقة منشأة فقط في Delphi (علاقة Master/Details) دون وجود علاقة حقيقية (Relation) في قاعدة البيانات فإن حذف السجلات الفرعية (Detail) يتم برمجياً باستعمال Command أو Query لتنفيذ جملة SQL تشبه التالية:
كود :
DELETE FROM detail_table WHERE (foreign_key_field = master_id_value)

حيث detail_table اسم الجدول الفرعي. foreign_key_field اسم الحقل في الجدول الفرعي الذي يحتوي على رقم تعريف السجل في الجدول الرئيسي. master_id_value رقم تعريف السجل في الجدول الرئيسي.

أما إذا كانت هناك علاقة بين الجدولين في قاعدة البيانات فإن الأمر يعتمد على ما إذا كان هناك تكامل مرجعي (ٌReferential Integrity) بخصوص حذف السجلات الفرعية عند حذف السجل الرئيسي المرتبط بها (Cascade Delete).
فإذا كان هناك تكامل مرجعي بخصوص الحذف فسيتم حذف السجلات الفرعية تلقائياً عند حذف السجل الرئيسي المرتبط بها، و إلا فستحتاج إلى حذفها برمجياً كما سبق.

نرجو الاستفادة و السلام.
الرد
#5
أحسنت أخي. لذا فإن أفضل الطريقتين الاولى و دلك بربط الجداول في sgbd.

جزاك الله كل الخير.
الرد
#6
عفوا أقصد الطريقة الثانية.
الرد
#7
السلام عليكم

ملاحظة بسيطة
إقتباس :فإذا كان هناك تكامل مرجعي بخصوص الحذف فسيتم حذف السجلات الفرعية تلقائياً عند حذف السجل الرئيسي المرتبط بها،
هذا في حالة ما إذا كانت referential action ـ = CASCADE
على ما أظن أغلب الـ rdbms تدعمها
كود :
http://en.wikipedia.org/wiki/Foreign_key
بالتوفيق
الرد
#8
السلام عليكم

اولا :حذف تسجيلة من tablemaster


;(procedure form1.Button1Click(Sender: TObject
begin
;tablemaster.Delete

;end
ثانيا
من الخاصية: Beforedelete ل:tablemaster يتم حذف جميع تسجيلات tabledetail


;(procedure tabledetailBeforeDelete(DataSet: TDataSet
var
;i:integer
begin

for i:=1 to tabledetail.recordcount do
begin try
;tabledetail.Last
;tabledetail.Delete
except
;end;end

;end
الرد
#9
السلام عليكم...

مجرد نصيحة: لا تستعمل الحلقات في مثل هذا الأمر. إذا كان الأمر يتعلق بحذف 10 سجلات أو 100 سجل فربما يكون مقبولاً، و لكن عند التعامل مع آلاف أو مئات الألاف من السجلات فإن استعمال حلقة في مثل هذا الأمر سيكون بطيئاً جداً جداً، و ربما يؤدي إلى توقف البرنامج عن الاستجابة إلى حين انتهاء الحلقة.

سلام.
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم