View Full Version : آپدیت کردن اطلاعات دیتا بیس با تریگر در چند جای مختلف.
digimohammad
یک شنبه 25 فروردین 1392, 20:30 عصر
با سلام به همه.
من در یک دیتابیس اطلاعات مربوط به تعداد محصولات یک فروشگاه را با استفاده از تریگر کم و زیاد میکنم.
فرضا یک محصول جز دسته الف و ب به صورت همزمان هست ، هر دسته از محصول در دیتا بیس دارای یک ردیف هست که تعداد محصولات را در خود نگه میداره.
وقتی که یک ردیف به جدول محصولات اضافه میکنم میتونم دسته اون محصول را خونده و سپس تعداد محصولات اون دسته رو در جدول تعداد زیاد کنم. این در صورتیه که محصول جز یک دسته باشه. اما وقتی یک محصول جز دو دسته یا بیشتر باشه نمیدونم باید چطور تعداد محصولات اون دسته ها رو اضافه کنم.
من سعی کردم با یک حلقه در تریگر این کار رو انجام بدم ولی دو مشکل وجود داره و اونهم اینکه در دستورات اسکیو ال نمیشه آرایه تعریف کرد. و مشکل دیگه اینکه اگر دسته ها به ترتیب بود میشد با چرخش حلقه آیدی دسته را کم و زیاد کرد و بعد تعداد پستهای اون دسته رو کم و زیاد کرد. امیدوارم که دوستان به من راهنمایی کنند ممنون.
سعید صابری
یک شنبه 25 فروردین 1392, 21:07 عصر
به نظر من ساختارتون مشکل داره.فکر کنم اطلاعات بیشتری بدی بشه بهتر کمکت کرد.
digimohammad
یک شنبه 25 فروردین 1392, 22:29 عصر
با یک مثال عرض میکنم، به کد زیر نگاه کنید. یک کد ساده هست:
BEGIN
UPDATE categories
SET posts_count = posts_count +1 WHERE id = new.catid;
END
این کد وقتی یک رکورد در جدول پستها اضافه شد ، با استفاده از آیدی موضوع اقدام به اپدیت تعداد پستهای اون موضوع در جدول موضوعات میکنه.
حالا اگه جای یک موضوع بخواهیم چند موضوع رو به هر پست اختصاص بدیم ، چطور باید تعداد پست این چند موضوع رو با استفاده از تریگر آپدیت کرد؟
سعید صابری
یک شنبه 25 فروردین 1392, 22:59 عصر
شما در تریگر محدودیتی برای تعداد آپدیت ندارید
میتونی 2 بار یا بیشتر از دستور آپدیت استفاده کنید و یا اینسرت استفاده کنید و یا در آپدیت همزمان چند فیلد تغییر بدی فقط کافیه از ، استفاده کنید یا می تونی Sp بنویسی و صداش بزنی.
شما بین begin..end هر چی بنویسی اجرا میشه نه فقط یک دستور.
digimohammad
دوشنبه 26 فروردین 1392, 10:42 صبح
عزیز جان میشه یک نمونه بهم نشون بدی؟ ببین میشه چند بار یک کد رو قرار بدم اما مشکل اینجاست که تعداد دسته ها متغییره. مثلا برای یک پست یک موضوع انتخاب میشه و برای پست دیگه ممکنه ده تا موضوع انتخاب بشه. نمیخوام محدودیت وجود داشته باشه.
در ضمن آیدی موضوع از یک فیلد که مربوط به پست جدیده دریافت میشه و بعد با تریگر آپدیت میشه..
سعید صابری
دوشنبه 26 فروردین 1392, 15:20 عصر
من هنوز نمیدونم دقیقا کجاش مشکل داری؟
اگه مشکلت اینه
اما وقتی یک محصول جز دو دسته یا بیشتر باشه نمیدونم باید چطور تعداد محصولات اون دسته ها رو اضافه کنم.
برای هر جدول باید یک تریگر بنویسی.
یا مشکلت با تریگر نویسی هست؟
tomalaki
دوشنبه 26 فروردین 1392, 15:43 عصر
به نظر من ساختار جدول مشکل داره. برای شمارش تعداد محصولاتی که داری کافی هست که از count استفاده کنی. میتونی در جدول محصولات یه فیلد دیگه برای شاخه در نظر بگیری. که اگه محصولی عضو 2 شاخه بود یا 20 شاخه همونجا قرار بگیره. بعد کافیه سلکت کنی.
digimohammad
دوشنبه 26 فروردین 1392, 22:05 عصر
به نظر من ساختار جدول مشکل داره. برای شمارش تعداد محصولاتی که داری کافی هست که از count استفاده کنی. میتونی در جدول محصولات یه فیلد دیگه برای شاخه در نظر بگیری. که اگه محصولی عضو 2 شاخه بود یا 20 شاخه همونجا قرار بگیره. بعد کافیه سلکت کنی.
عزیز میشه یه مثال بزنی؟
digimohammad
دوشنبه 26 فروردین 1392, 22:08 عصر
من هنوز نمیدونم دقیقا کجاش مشکل داری؟
اگه مشکلت اینه
برای هر جدول باید یک تریگر بنویسی.
یا مشکلت با تریگر نویسی هست؟
داداش گلم ، با نوشتن تریگر زیاد مشکل ندارم هر چند توش تازه کارم. ببین عزیز میخوام یه خط کد بنویسم مثلا و با استفاده از حلقه چند بار اجراش کنم. در هر بار اجرا هم آیدی جایی که باید آپدیت بشه فرق میکنه. شما فرض کن مثل یه حلقه فور که ایندکسهای یک آرایه رو میخونه. در تریگر میتونم یک حلقه ایجاد کنم ولی مشکل اینجاست که من میخوام یک آرایه از آیدیها رو بدم به تریگر... چه کنم دوستان ؟
digimohammad
پنج شنبه 29 فروردین 1392, 09:49 صبح
انگار همه هنگ کردن ؟؟؟؟؟ :دی
tomalaki
پنج شنبه 29 فروردین 1392, 13:10 عصر
CREATE TABLE test.prct (
prct_id int(11) NOT NULL AUTO_INCREMENT,
product_id int(11) DEFAULT NULL,
cat_id int(11) DEFAULT NULL,
PRIMARY KEY (prct_id),
CONSTRAINT FK_prct_category_cat_id FOREIGN KEY (cat_id)
REFERENCES test.category (cat_id) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT FK_prct_product_p_id FOREIGN KEY (product_id)
REFERENCES test.product (p_id) ON DELETE RESTRICT ON UPDATE RESTRICT
)
ENGINE = INNODB
AUTO_INCREMENT = 1
CHARACTER SET latin1
COLLATE latin1_swedish_ci;
CREATE TABLE test.category (
cat_id int(11) NOT NULL AUTO_INCREMENT,
cat_name varchar(50) DEFAULT NULL,
PRIMARY KEY (cat_id)
)
ENGINE = INNODB
AUTO_INCREMENT = 1
CHARACTER SET latin1
COLLATE latin1_swedish_ci;
CREATE TABLE test.product (
p_id int(11) NOT NULL AUTO_INCREMENT,
product_name varchar(50) DEFAULT NULL,
PRIMARY KEY (p_id)
)
ENGINE = INNODB
AUTO_INCREMENT = 13
AVG_ROW_LENGTH = 8192
CHARACTER SET latin1
COLLATE latin1_swedish_ci;
حالا این کد رو برای شمارش محصولاتی که توی یک دسته خاص هستند استفاده کن:
SELECT COUNT(prct_id) FROM prct WHERE cat_id=1
اینم نگاره:
103019103018
digimohammad
جمعه 30 فروردین 1392, 17:40 عصر
ممنون tomalaki (http://barnamenevis.org/member.php?104222-tomalaki) جان ، یه چیزهایی دستگیرم شد.. البته چیزی که من میخواستم متفاوت بود. اما فکر میکنم برداشت جدیدی که از مثال پیدا کردم و پیوند زدن اون به اطلاعات قبلیم میتونه کارمو راه بندازه.. باز هم ممنون
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.