PDA

View Full Version : رکورد یکتا



majoran
دوشنبه 29 بهمن 1386, 12:17 عصر
سلام من می خوام تو تعداد رکورد های یک فیلد که از 0و 1 تشکیل شدند فقط یک رکورد دارای 1 باشم یعنی اگه یکی از فیلد هام رکورد اکتیوش 1 باشه مابقی رکورد هام نتونن 1 باشن ولی 0 چرا و در صورتی بتونن یک بشن که همه 0 باشه باید چی کار کنم این کار سمت رکورد دیتابیس باید انجام بشه یا سمت اپلیکیشن

reza_rad
دوشنبه 29 بهمن 1386, 12:29 عصر
این کار سمت رکورد دیتابیس باید انجام بشه یا سمت اپلیکیشن
مطمئنا سمت دیتابیس. و با استفاده از تریگر.
تریگر ها رو مطالعه کنید:

Triggers (http://dev.mysql.com/doc/refman/5.0/en/triggers.html)

majoran
دوشنبه 29 بهمن 1386, 12:32 عصر
دوستان یک توضیح فارسی در مورد این مطلب ندارید اگه لطف کنید و فارسی برام بزارید یا منبع فارسیشو معرفی کنید متشکر می شم

reza_rad
دوشنبه 29 بهمن 1386, 12:37 عصر
ببینید تریگر در ارتباط با یک جدول هست و زمانی که event خاصی روی جدل اتفاق بیفته فراخوانی میشه. مثلا هرزمانی قرار باشه جدول شما update باشه یک تریگر مربوط به update می تونید بنویسید که فراخوانی بشه.
کد مثال هم توی لینکی که دادم هست و نیاز به توضیح فارسی نداره.

majoran
دوشنبه 29 بهمن 1386, 12:45 عصر
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
-> FOR EACH ROW SET @sum = @sum + NEW.amount;
این مثال رو دیدم ولی خوب الان من موندم کجای این دستورات مقادیر خودمو باید بزارم دوست عزیز

reza_rad
دوشنبه 29 بهمن 1386, 12:53 عصر
الان من موندم کجای این دستورات مقادیر خودمو باید بزارم
خط دوم و سوم اسکریپت تولید تریگر هست. این مثال مربوط به تریگری روی جدول account هست(که در خط 1 تولید شده) ، که این تریگر هنگام Insert دیتا در جدول مجموع فیلد amount رو حساب می کنه.
شما برای کار خودتون باید تریگری بنویسید که هنگام Update یا insert چک کنه که اگه یک رکورد که مقدار فیلد active اش 1 هست وجود داره دیگه نتونه 1 اینتسرت یا آپدیت کنه.

majoran
دوشنبه 29 بهمن 1386, 15:28 عصر
دوست عزیز اگه لطف کنی و یه مثال برام بنویسی خیلی بهتره چون من اینجوری هرچی تلاش کردم فایده ای نداشت یک لطف کن و این کار رو برای من بکن

reza_rad
دوشنبه 29 بهمن 1386, 15:55 عصر
دوست عزیز اگه لطف کنی و یه مثال برام بنویسی خیلی بهتره چون من اینجوری هرچی تلاش کردم فایده ای نداشت یک لطف کن و این کار رو برای من بکن
این هم کد. البته تست نشده شاید ایراد سینتکس داشته باشه که خودتون می تونید حلش کنید.

CREATE TABLE Mytable(
a1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
a2 INT DEFAULT 0
);


CREATE TRIGGER testtrigger BEFORE INSERT ON Mytable
FOR EACH ROW
BEGIN
IF (SELECT MAX(a2) FROM myTable)>0 THEN
IF NEW.a2=1 THEN
RETURN FALSE;
END IF;
END IF;
END;

majoran
دوشنبه 29 بهمن 1386, 16:57 عصر
دوست عزیز از لطفت متشکرم حالا برای اینکه اینو تو پی اچ پی پیادش کنم باید کد زیر رو به عنوان کوئری معرفی کنم
CREATE TRIGGER testtrigger BEFORE INSERT ON Mytable
FOR EACH ROW
BEGIN
IF (SELECT MAX(a2) FROM myTable)>0 THEN
IF NEW.a2=1 THEN
RETURN FALSE;
END IF;
END IF;
END;

reza_rad
دوشنبه 29 بهمن 1386, 17:02 عصر
[QUOTE]حالا برای اینکه اینو تو پی اچ پی پیادش کنم باید کد زیر رو به عنوان کوئری معرفی کنم[/
QUOTE]
خیر دوست عزیز این کدی که من گفتم مربوط به MYSql است و نیاز به پیاده سازی از سمت php نداره . فقط کافیه در MySql console یا در محیط های اسکریپت phpmyadmin و دیگر محیط های مدیریت mysql اجرا بشه.
برای دفعات بعدی این اسکریپت یک تریگر ایجاد می کنه که مانند یک ایونت هندلر روی جدول شما کار می کنه و در هنگام Insert و update اون شرایطی رو که میخواهید چک می کنه.

majoran
دوشنبه 29 بهمن 1386, 17:35 عصر
خوب دوست گرامی ببخشید من بیش از حد مزاحم شما دارم می شم برای مای اسکیوال کجا باید اینو پیاده کنم

reza_rad
سه شنبه 30 بهمن 1386, 08:16 صبح
خوب دوست گرامی ببخشید من بیش از حد مزاحم شما دارم می شم برای مای اسکیوال کجا باید اینو پیاده کنم
خواهش می کنم.
شما از MYSQL به چه صورت استفاده می کنید؟
یعنی table ها تون رو کجا ایجاد کردید ؟ توی چه محیطی؟ از توی همون محیط

majoran
سه شنبه 30 بهمن 1386, 08:39 صبح
آره از تو خود مای اسکیوال به صورت دستی تک تک درست کردم بدون کد نویسی

reza_rad
سه شنبه 30 بهمن 1386, 08:54 صبح
آره از تو خود مای اسکیوال به صورت دستی تک تک درست کردم بدون کد نویسی
ببینید دوست عزیز خود MYSQL که اینترفیس نداره. در واقع Mysql یک database engine هست و رابط کاربری ای نداره که شما از داخل اون بتونید جدول اضافه کنید.
1-پس شما یا باید با کدنویسی در MYSQL Console اینکار رو انجام داده باشید
2-یا با Mysql query browser و یا phpMyadmin یا GUI های دیگری که برای mysql طراحی شده اند.
از اونجایی که شما می گی بدون کدنویسی اینکار رو انجام دادی پس حالت اول بعید به نظر میرسه حالا باید متوجه بشید که از چه GUI ای برای کار با mysql استفاده می کنید.

majoran
سه شنبه 30 بهمن 1386, 09:23 صبح
ببخشید دوست عزیز من با php myadmin این کار رو انجام دادم

reza_rad
سه شنبه 30 بهمن 1386, 09:43 صبح
ببخشید دوست عزیز من با php myadmin این کار رو انجام دادم
خب حالا توی PHPMyAdmin یک قسمتی داره که شما می تونید کوئری ها تون رو و اسکریپت های SQL تون رو اونجا اجرا کنید دنبال لینکی با عنوان Query یا SQL بگردید.

majoran
سه شنبه 30 بهمن 1386, 09:59 صبح
با مشکل بر خورد کردم اسم تیبل من azterm است و اسم فیلد مورد نظر من active است


CREATE TRIGGER testtrigger BEFORE INSERT ON azterm
FOR EACH ROW
BEGIN
IF (SELECT MAX(active) FROM azterm)>0 THEN
IF NEW.azterm=1 THEN
RETURN FALSE;
END IF;
END IF;
END;
این ارور میاد

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TRIGGER testtrigger BEFORE INSERT ON azterm
FOR EACH ROW
BEGIN

reza_rad
سه شنبه 30 بهمن 1386, 10:49 صبح
چه ورژنی از MySQL استفاده می کنید؟

majoran
سه شنبه 30 بهمن 1386, 10:58 صبح
+ MySQL 4.1.12
+ phpMyAdmin 2.6.2-pl1

reza_rad
سه شنبه 30 بهمن 1386, 11:05 صبح
MySQL 4.1.12
برای استفاده از تریگر باید از MySQL 5.0.2 به بالا استفاده کنید.

majoran
سه شنبه 30 بهمن 1386, 11:19 صبح
ای بابا حالا برای این مشکل ما هیچ راه دیگه ای وجود نداره

reza_rad
سه شنبه 30 بهمن 1386, 11:26 صبح
ای بابا حالا برای این مشکل ما هیچ راه دیگه ای وجود نداره
چرا دو راه دارید:
1- MYSQL خودتون رو عوض کنید.
2- اینکار رو از سمت application انجام بدید (این روش این مشکل رو داره که اگه زمانی یک اسکریپت اینسرت یا آپدیت مستقیما روی دیتابیس اجرا بشه نه از طرف اپلیکیشن شما، دیگه نمیشه روی این شرط شما رو اعمال کرد.) ولی اگه مطمئن هستید که تمام دیتا هندلینگ شما از سمت برنامه خودتون انجام میشه می تونید از این روش استفاده کنید.

majoran
سه شنبه 30 بهمن 1386, 11:40 صبح
خوب از اونجا که سرور نمیشه عوض شه و همچین کاری رو برای من نمی کنه راه دوم رو انتخاب می کنیم و حتمی باید برم تو قسمت php مشکلمو بیان کنم

reza_rad
سه شنبه 30 بهمن 1386, 11:45 صبح
حتمی باید برم تو قسمت php مشکلمو بیان کنم
بله. درسته. البته به MySql هم مربوط میشه چون خلاصه باید دیتاهای جدولتون توی Mysql رو چک کنید. ولی به دلیل اینکه سمت Php بیشتر نیاز به کد داره بهتره در تالار php مطرح بشه.
باسپاس