PDA

View Full Version : سوال: if not exist insert



tecnocomputer2
یک شنبه 15 خرداد 1390, 12:38 عصر
با سلام.

در صورتی که رکورد وجود نداشته باشد، اضافه کند. (برای جلوگیری از وارد کردن رکوردهای تکراری)

ارادتمند.

یوسف زالی
دوشنبه 16 خرداد 1390, 01:55 صبح
سلام.
فکر کنم یه شرط بگذاری بشه.
insert into Tbl1(F1) values(Data1) where F1 <> data1

Arsess
جمعه 20 خرداد 1390, 12:20 عصر
فیلدی که نباید تکراری باشه PRIMARY کن

Jason.Bourne
سه شنبه 19 دی 1391, 14:29 عصر
سلام.
فکر کنم یه شرط بگذاری بشه.
insert into Tbl1(F1) values(Data1) where F1 <> data1

همچین چیزی توی MySQL شدنی هست؟ امتحان کردید؟
من که تست کردم؛ نشد.

سعید صابری
سه شنبه 19 دی 1391, 14:50 عصر
راه زیاد داره یک راهش اینه یک تابع بنویسی یا نخواستی ننویس کد ها را مستقیم در کوئریت استفاده کن
مثلا

IF((SELECT COUNT(id) FROM TABLE WHERE id ='Data')>0,'موجود است','موجود نیست')


میتونی اینو بصورت یک تابع ثبت کنی و پارامتر بهش پاس بدی ییا به جای موجود نیست کد insert بنویسی.

ولی بهترین راه استفاده از PRIMARYاست یا روش های دیگر که دیتابیس جلوی ثبت فیلد تکراری بگیره

Jason.Bourne
سه شنبه 19 دی 1391, 15:17 عصر
من برای جلوگیری از ذخیره داده های تکراری از کوئری زیر استفاده میکنم.


INSERT IGNORE INTO phoneBook (name, phone) VALUES (ali,2352351);

همانطور که می دانید، IGNORE باعث میشود که اگر داده تکراری وجود داشت و MySQL با خطا مواجه شد، از خطا صرف نظر شده و INSERT انجام نمی شود.
تا اینجا مشکلی نیست.
اما اگر بخواهم فیلد دیگری به جدول اضافه کنم، و با توجه به مقدار آن فیلد عمل درج را انجام دهم با مشکل مواجه می شوم.
جدول من مانند زیر است:

98046

من میخواهم که با توجه به مقدار فیلد owner عمل درج انجام شود و بررسی تکراری بودن انجام شود.
مثلا میخوام در جدول بالا بشود فیلد جدیدی با مشخصات زیر درج شود.
name: Ali Akbari
phone: 118
owner: Mohammad

یعنی اینکه مقدار name و phone میتواند تکراری باشد، به شرط اینکه owner آنها تکراری نباشد.

سعید صابری
سه شنبه 19 دی 1391, 18:41 عصر
از همون روش که گفتم استفاده کن یک تابع تعریف کن که چک کنه.همون کد بالا فقط قسمت شرط باید تغییر بدی

Jason.Bourne
جمعه 22 دی 1391, 20:36 عصر
از همون روش که گفتم استفاده کن یک تابع تعریف کن که چک کنه.همون کد بالا فقط قسمت شرط باید تغییر بدی

این چک کردن میتونه از طریق زبان برنامه نویسی هم انجام بشه (یک کوئری برای چک کردن تکراری بودن یا نبودن و سپس کوئری دیگری برای درج در صورت تکراری نبودن).

حالا سوال این هست که کدام روش بهتر هست؟ استفاده از Stored Procedure یا اجرای دو کوئری؟

سعید صابری
جمعه 22 دی 1391, 21:56 عصر
به نظر من طرف دیتابیس بهتر است.

Jason.Bourne
شنبه 23 دی 1391, 01:46 صبح
این طور که متوجه شدم، در سمت دیتابیس میشه هم از طریق SP اینکار را انجام داد و هم از طریق تریگر.

در این مورد چه نظری دارید؟ (لطفا با ذکر دلیل)

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

سعید صابری
شنبه 23 دی 1391, 11:09 صبح
من نمیدونم چرا اینقدر دور خودت میچرخی؟
چرا یک Functionتعریف نمی کنی؟

ببین اول تریگر در چه حالت های اجرا میشه؟ قبل و بعد Insert، قبل و بعد Update ، قبل و بعد Delete.اگر با تریگر بخوای انجام بدی دقیقا همون روال معمولی باید دوبل انجام بدی.یه جورایی لقمه را دور سر خودت بچرخونی.

یک تابع تعریف کن بعد به راحتی چه سمت سرور چه سمت کلاینت به راحتی ازش استفاده کن مثل این میمونه توابع استاندارد Mysql فراخوانی کنی.

Jason.Bourne
شنبه 23 دی 1391, 17:53 عصر
من نمیدونم چرا اینقدر دور خودت میچرخی؟



به این دلیل که می خواهم بهترین روش را انتخاب کنم.



یک تابع تعریف کن بعد به راحتی چه سمت سرور چه سمت کلاینت به راحتی ازش استفاده کن مثل این میمونه توابع استاندارد Mysql فراخوانی کنی.

منظورتون از تابع همون Stored Procedure هست؟




اگر با تریگر بخوای انجام بدی دقیقا همون روال معمولی باید دوبل انجام بدی.یه جورایی لقمه را دور سر خودت بچرخونی.


میشه در این مورد بیشتر توضیح بدین؟


سپاسگزارم

سعید صابری
شنبه 23 دی 1391, 19:32 عصر
منظورتون از تابع همون Stored Procedure هست؟

خیر.Function منظورمه.اطلاعات بیشتر میتونی جستجو کنی.

تریگر یک رویه هست که در یکی از حالاتی که در بالا گفتم فقط اتفاق می افته.برای کار شما باید Before insert باید استفاده کنی.حالا همه کارهایی را که در حالت عادی قراره انجام بدی باید در این اینجا بنویسی.تازه با کلی دردسر جدید.

Jason.Bourne
یک شنبه 24 دی 1391, 01:01 صبح
خیر.Function منظورمه.اطلاعات بیشتر میتونی جستجو کنی.


من متوجه منظورتان نمی شم.
Function را با زبان برنامه نویسی پیاده سازی کنم یا در MySQL؟

mostafa_shaeri_tj
یک شنبه 24 دی 1391, 18:36 عصر
جواب هارو كه از اول ميخوندم تازه متوجه شدم ممكنه چقدر امكانات ديگه تو اين ابزارها مثل ماى اسكيوال باشه كه ما به دليل عدم اشنايي با اونها واسه يه كار ساده كلي دور خودمون ميپيچيم. واسه اين كار شما لازمه كه محدوديت يكتا بودن رو روى مجموعه اي از ستونهاى مدنظرمون اعمال كنيم:

alter table tbl1 add unique index(name, phone, owner);

با اين كار هنگام ثبت ركورد تكرارى ديتابيس خطاى تكراري بودن ميده و اگر فقط دوتا از ستونها تكراري باشن خطايي ايجاد نميشه و عمل ثبت با موفقيت انجام ميشه