Gytyonline
مديريت كل انجمنها
پست: 899
عضو شده در: 14 شهریور 1384
محل سکونت: tehran
امتياز: 8184
|
عنوان: insert ignore into و replace into در mysql |
|
|
سلام
امروز میخوام دو نکته بنویسم که شاید برایتان در کار با php و Mysql جدید باشد و در عین حال پر کاربر.
این 2 نکته مربوط میشود به وارد کردن یک رکورد جدید در table ها همان طوری که همگی میدانیم برای وارد کردن یک رکورد جدید در جدول از کوئری زیر استفاده میکنیم:
کد: |
INSERT INTO table_name VALUES (value1, value2, value3,...)
OR
INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...) |
که در دستور اول فقط به ترتیب فیلدها متغییرها را وارد کرده و هر متغییر در فیلد مربوطه قرار میگیرد و در دستور دوم هم نام فیلدهایی را که قرار است متغییر در آنها قرار بگیرد وارد میکنیم.
توجه: در نوع اول باید تمامی فیلدها ذکر شوند و اگر فیلدی قرار باشد متغییر در آن قرار نگیرد باز هم باید اورده شود تا ترتیب حفظ شود ولی مقدار آن را '' قرار میدهیم تا Null قرار گیرد.
خوب نکته جدید چیست؟
فرض کنید ما کلید اصلی در جدول را یک فیلد رشتهای قرار داده باشیم یا فیلدی که auto_index نباشد و مقدار آن را خود ما تعیین میکنیم ولی خاصیت یکتا بودن را دارد که امکان اشتباه بالا میرود، در این گونه موارد ممکن است ما مقداری را برای کلید اصلی در نظر بگیریم که قبلا وارد شده است در insert های قبلی و اگر ما بخواهیم این مقدار تکراری در جدول وارد نشود و از بروز این گونه خطاها جلوگیری شود از دستور زیر به جای دستور insert معمولی استفاده میکنیم:
کد: |
INSERT IGNORE INTO table_name
(primaryKey, column1, column2)
VALUES
('abc', 1, 2); |
خوب حال کوئری بالا رکوردی را با PK که ما برای آن تعیین کردهایم یعنی abc قبل از اینکه وارد جدول کند چک میشود که رکوردی با این PK وجود دارد یا نه اگر وجود داشت این کوئری دستور را نادیده گرفته و اجرا نمیشود و برنامه نیز متوقف نمیشود به خاطر خطا و به کار خود ادامه میدهد ولی اگر از روال قبل استفاده میکردیم خطای ایجاد شده باعث بروز مشکل در اجرای برنامه میشد.
حال فرض کنید ما بخواهیم رکوردی قبلا با این کلید اصلی بوده است ولی در این وارد کردن اطلاعات جدید اطلاعات آن فیلدها تغییر کرده است و یعنی ما نمیدانیم این کلید اصلی وجود دارد یا نه و از طرفی هم در نظر داریم اگر وجود دارد باید اطلاعات آن به روز شود میتوانیم از کوئری زیر استفاده نماییم:
کد: |
REPLACE INTO table_name
(primaryKey, column1, column2)
VALUES
('abc', 1, 2); |
شاید با خودتان بگویید مزیت این روش چیست یا اینکه از update استفاده میکنیم؟
اما باید بگوییم که Update زمانی به کار میاید که شما بدانید قطعا رکوردی موجود میباشد و قصد بروز رسانی آن را داشته باشید اما اینجا ممکن هست رکورد مورد نظر موجو باشد و یا اینکه رکورد مورد نظر موجود نباشد در صورت موجود بودن بروز رسانی خواهد شد و در صورت عدم وجود insert خواهد شد.
و مزیت این روش این میباشد که اگر شما به صورت معمولی استفاده نمایید اول باید با یک کوئری وجود یا عدم وجود این رکورد را چک کنید و با توجه به جوابی که دریافت خواهید کرد در صورت عدم وجود آن رکورد، ان را insert و در صورت وجود آن را updaete خواهید کرد یعنی 3 کوئری ( که بین کوئری دوم و سوم یکی اجرا خواهد شد) اما با این روش شما فقط با نوشتن 1 کوئری این کار را انجام دادهاید.
در برنامههای کوچک و دیتابیسهایی که رکورد زیادی ندارند و تعداد دفعات فرستادن درخواست کم میباشد شاید زیاد مهم نباشد ولی در دیتابیسهایی با رکوردهای زیاد و پر درخواست مطمعنا پرکاربرد است. و در کل هرچه تعداد درخواستهای شما به دیتابیس کمتر باشد برنامه شما بهینهتر میباشد.
نکته: در insert ingnore into این خاصیت فقط و فقط برای کلید اصلی شما فراهم میشود نه فیلدهای دیگر حتی اگر آنها UNIQUE باشند.
موفق باشید.
امین شفیعی; |
|