• 3 رای - 4.33 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل در حذف رکورد ( بخش ، مجموعه ، زیر مجموعه)
#1
Exclamation 
سلام به همه دوستان من یک جدول با ساختار hierarchical دارم :


کد پی‌اچ‌پی:
CREATE TABLE IF NOT EXISTS `set` (
  `
id_setint(11NOT NULL AUTO_INCREMENT COMMENT 'ID Number of Set',
  `
id_secint(11NOT NULL COMMENT 'ID Number of Section',
  `
nametext NOT NULL COMMENT 'Name of Set',
  `
parentint(11) DEFAULT NULL COMMENT 'Parent of Set',
  
PRIMARY KEY (`id_set`)
ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='Set Of List' AUTO_INCREMENT=20 

حال می خوام وقتی یک رکورد حذف کردم باقی رکورد ها که وابسته به این رکورد یا بهتر بگم فرزند این رکورد هستن تا آخر حذف شوند چون پدری و سر لیستی برای نمایش اونها با نبود پدرشون وجود ندارد و فقط میشوند داده های اضافی در جدول و شایدم دچار مشکل کنند تراکنش های بعدیمو. لطفا راهنمایی کنید ممنونم.
  پاسخ
تشکر شده توسط :
#2
خیلی ساده وقتی میخوای پاک کنی به این صورت کوئری بزن
کد:
DELETE FROM set WHERE parent='cond' OR id_set='cont' OR id_sec='cont';
تونل ها مي گويند : راه هست؛ حتي در دل سنگ ها.Wink
استفاده از دکمه تشکر(Heart) نشان شخصیت شماست;
درگاه پرداخت 724
  پاسخ
تشکر شده توسط :
#3
دوست گرامی اول ممنون از پاسخ ولی این sql شما فقط یک مورد از رکورد رو پاک میکنه نه لیستی از رکورد های وابسته به این id_set که همون parent رکورد بعدی باشه

این SQL شما صحیح نیست خودت یه بار تست کن منظورمو میفهمی.!!!!!

میخوای با این داده ها انجام بده برای مثال :


کد پی‌اچ‌پی:
INSERT INTO `set` (`id_set`, `id_sec`, `name`, `parent`) VALUES
(11'موتور'0),
(
21'اتاق'0),
(
31'داخل موتور'0),
(
41'میلنگ'1),
(
51'پیستون'1),
(
61'محور'4),
(
71'رینگ پیستون'5),
(
81'سمت عقب'2),
(
91'گلگیر چرخ سمت چپ'8),
(
101'گلگیر چرخ عقب'9),
(
151'شیشه'2),
(
161'لوازم جانبی'0),
(
171'درب'2),
(
192'اتاق'0); 

یعنی اگر "موتور" رو پاک کردی باید تمامی زیر مجموعه ها هم پاک بشند مثل : " میلنگ -> محور " و " پیستون -> رینگ پیستون " و اگر ادامه داشت تا آخر به همین روش انجام پذیرد.
  پاسخ
تشکر شده توسط :
#4
اها:دی خوب اینو با اس کیو ال بلد نیستم ولی با خوده php با یه حلقه میتونی پاکشون کنی:دی ولی با خود Sql هم میشه

از بالا شروع کن و به صورت درختی برو پایین همه رو پاک کن یه چیزی شبیه کویک سورت:دی
تونل ها مي گويند : راه هست؛ حتي در دل سنگ ها.Wink
استفاده از دکمه تشکر(Heart) نشان شخصیت شماست;
درگاه پرداخت 724
  پاسخ
تشکر شده توسط :
#5
دوست گرامی ممنون از راهنمایی ولی این راهنمایی شما کاربردی نیست و خیلی ... است !!!

از باقی دوستان برای حل این مسئله کمک میخوام . متشکرم .
  پاسخ
تشکر شده توسط :
#6
واسه این کار 2 تا راه داری:
راه ساده:
وقتی می‌خوای کوئری delete رو بفرستی، چک کنی ببینی این رکورد سرشاخست یا نه! اگر سرشاخه بود(parent == 0)، یک کوئری دومی هم ارسال کنی و زیردسته‌هارو هم حذف کنی(DELETE WHERE parent = $this -> id).
راه حرفه‌ای تر:
استفاده از trigger:
کد:
delimiter $$
CREATE TRIGGER delete_trigger
AFTER delete ON set
FOR EACH ROW
BEGIN
DELETE FROM set WHERE parent = OLD.id;
END$$
delimiter ;
  پاسخ
تشکر شده توسط : lili.lrp
#7
(۱۳۹۲ فروردین ۰۴, ۱۰:۴۵ ب.ظ)evergreen نوشته: دوست گرامی ممنون از راهنمایی ولی این راهنمایی شما کاربردی نیست و خیلی ... است !!!

از باقی دوستان برای حل این مسئله کمک میخوام . متشکرم .

دیگه شرمنده راه حل های ما در همین حد ... بودSleepyWink
تونل ها مي گويند : راه هست؛ حتي در دل سنگ ها.Wink
استفاده از دکمه تشکر(Heart) نشان شخصیت شماست;
درگاه پرداخت 724
  پاسخ
تشکر شده توسط :
#8
حق با بهزاده.
اول باید چک کنی رکوردی که حذف میکنی خودش سرشاخه هست یا نه. اگه سرشاخه بود اول باید زیر مجموعه هاش پاک بشن در نهایت خود سرشاخه رو پاک کنی.
بنده طعم ايمان را نمي چشد، تا اينكه دريابد آنچه اتفاق نيفتاده است نمي شد كه اتفاق بيفتد؛و آنچه شده و اتفاق افتاده است,نمي شد كه نشود و اتفاق نيفتد....حضرت علي(ع)
  پاسخ
تشکر شده توسط :
#9
(۱۳۹۲ فروردین ۰۵, ۰۱:۰۹ ق.ظ)behz4d نوشته: واسه این کار 2 تا راه داری:
راه ساده:
وقتی می‌خوای کوئری delete رو بفرستی، چک کنی ببینی این رکورد سرشاخست یا نه! اگر سرشاخه بود(parent == 0)، یک کوئری دومی هم ارسال کنی و زیردسته‌هارو هم حذف کنی(DELETE WHERE parent = $this -> id).
راه حرفه‌ای تر:
استفاده از trigger:
کد:
delimiter $$
CREATE TRIGGER delete_trigger
AFTER delete ON set
FOR EACH ROW
BEGIN
DELETE FROM set WHERE parent = OLD.id;
END$$
delimiter ;

بله اقا بهزاد تو stackoverflow اینو پیدا کرده بودم ولی ایراد داشت و به نظر خودم هم Trigger نویسی بهتره چون کد php خیلی داغونه.
  پاسخ
تشکر شده توسط :
#10
همون تریگر به نظرم بهترینه. اینجا را هم یه نگاهی بندازید.
تو MSSQL یه امکانی بود که می تونستید یه فیلد از یک جدول را به یه فیلد دیگه از همون جدول ارتباط بدید. با این کار خودش خودکار فیلدهای مرتبط را پاک یا به روز رسانی می کرد. فقط نمی دونم که این امکان هم توی MySQL هست یا نه؟
سالهــــا مـــــى گــــــذرد، حادثه ها مى آید
انتظـــــار فـــــــرج از نیمـــــه خــــــرداد کشم

[عکس: ShowPicture.aspx?ID=52750d12-5d92-4286-9...height=100]
  پاسخ
تشکر شده توسط : lili.lrp


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان