ایجاد جداول موردنیاز
برای به کارگیری دستورهای موجود در این مقاله و پیش بردن مطالب، ابتدا باید جدولهای مورد نیاز برای دادههای خود را ایجاد کنیم. ما در اینجا از جداولی به نامهای person و favorite_food استفاده میکنیم که به جهت آشنایی با ساختار آنها، به نحوه ایجاد آنها در این قسمت میپردازیم. برای ایجاد جدول person کافی است دستور زیر را اجرا کنید:
mysql> CREATE TABLE person
-> (person_id SMALLINT UNSIGNED,
-> fname VARCHAR(20),
-> lname VARCHAR(20),
-> eye_color ENUM('BR','BL','GR'),
-> birth_date DATE,
-> street VARCHAR(30),
-> city VARCHAR(20),
-> state VARCHAR(20),
-> country VARCHAR(20),
-> postal_code VARCHAR(20),
-> CONSTRAINT pk_person PRIMARY KEY (person_id)
-> );
Query OK, 0 rows affected (0.37 sec)
لازم به ذکر است که برای ایجاد پایگاه داده و اجرای دستورهای MySQL راههای مختلفی میتوان در نظر گرفت. به شما خوانندگان محترم توصیه میکنیم در صورتی که در این زمینه اطلاعات کافی ندارید، ابتدا به یادگیری مباحث مقدماتیتر بپردازید. مثلاً در این مقاله تا حدودی میتوانید با نحوه ایجاد پایگاه داده در MySQL آشنا شوید. بعد از ایجاد اولین جدول، برای ایجاد جدول دوم نیز به اجرای دستوری مشابه به شکل زیر میپردازیم:
mysql> CREATE TABLE favorite_food
-> (person_id SMALLINT UNSIGNED,
-> food VARCHAR(20),
-> CONSTRAINT pk_favorite_food PRIMARY KEY (person_id, food),
-> CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
-> REFERENCES person (person_id)
-> );
Query OK, 0 rows affected (0.10 sec)
وارد کردن داده
با توجه به اینکه هنوز دادهای در جدولهای person و favorite_food موجود نیست، نخستین کاری که باید صورت بگیرد آن است که به کمک دستور insert دادههای مربوطه را به جدول وارد کنیم. سه جزء اصلی در دستور insert وجود دارند:
- نام جدولی که قرار است دادهها به آن اضافه شوند
- نام ستونهایی از جدول که قرار است دادهها وارد آنها شوند
- مقادیری که باید در هر یک از ستونها قرار داده شوند
شما مجبور نیستید که برای همه ستونهای موجود در یک جدول مقدار تعریف کنید (مگر آنکه تمامی ستونها به صورت not null تعریف شده باشند). در بعضی موارد آن ستونهایی که در ابتدا به وسیله دستور insert مقداردهی نشدهاند، بعداً به کمک دستور update مقداردهی میشوند. در سایر موارد نیز یک ستون ممکن است هرگز برای یک سطر خاص مقداری دریافت نکند (مانند زمانی که مثلاً یک مشتری قبل از ارسال سفارشی، آن را کنسل میکند. در نتیجه نمیتوان مقداری برای ستون تاریخ ارسال سفارش در جدول مربوطه در پایگاه داده متصور بود).
تولید داده برای کلیدهای عددی
قبل از وارد کردن داده به جدول person، لازم است که بررسی کنیم مقادیر عددی مربوط به کلیدهای اصلی چگونه تولید میشوند. به جای آنکه هر بار بخواهید کل دادهها را جستجو کنید و عددی را که تکراری نباشد برای هر سطر جدید داده که وارد جدول میکنید، تعیین کنید، میتوانید از گزینههای زیر کمک بگیرید:
- به بزرگترین مقداری که فعلا در جدول مورد نظر برای ستون کلید اصلی موجود است، توجه کرده و یک عدد بالاتر از آن را برای داده جدیدی که میخواهید وارد کنید، در نظر بگیرید.
- اجازه دهید که سرور پایگاه داده خودش مقداری را برای چنین ستونهایی تعیین کند.
اگرچه روش نخست بدون مشکل به نظر میرسد، اما در محیطهایی که چندین کاربر به وارد کردن داده اقدام میکنند، ممکن است مشکلساز شود. زیرا مثلاً محتمل است که دو کاربر به صورت همزمان به جدول نگاه کرده و بزرگترین مقدار را در نظر بگیرند. در نتیجه مقداری که هر دوی آنها برای داده خود قرار میدهند، یکسان خواهد بود. به جای چنین کاری بهتر است از سرور پایگاه داده کمک بگیرید. تمامی سرورهای پایگاه داده، امروزه روش قدرتمند و امنی برای تولید مقادیر کلیدهای عددی (کلیدهایی که مقادیر عددی به خود میگیرند) دارند. در برخی سرورها مانند پایگاه داده Oracle، یک شئ مجزا (که sequence نام دارد) برای این کار در نظر گرفته میشود.
در خصوص MySQL تنها کافی است که ویژگی auto-increment را برای ستون مربوط به کلید اصلی فعال کنید. معمولاً این کار در هنگام ایجاد جدول صورت میگیرد. اما حال که ما این کار را انجام ندادهایم، به نوعی توفیق اجباری است که با دستور SQL دیگری به نام alter table آشنا شویم. کاربرد این دستور در ویرایش کردن و تغییر دادن ویژگیهای یک جدول موجود (قبلاً ایجاد شده) است:
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
اگر شما این دستورها را در پایگاه داده خود اجرا میکنید، ابتدا باید قید مربوط به کلیدهای خارجی را در جدول favorite_food به حالت غیرفعال درآورید. بعد از اجرای این دستور و ویرایش جدول person دوباره قیود مربوط به کلیدهای خارجی را فعال نمایید. توالی دستورهایی که باید اجرا گردند به قرار زیر است:
set foreign_key_checks=0;
ALTER TABLE person
MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
set foreign_key_checks=1;
کد فوق در حقیقت ستون person_id در جدول person را دوباره تعریف میکند. اگر شما جدول مورد نظر را با دستور desc بررسی کنید، متوجه خواهید شد که در ستون Extra مربوط به person_id ویژگی auto-increment ذکر شده است:
با انجام فرآیند فوق زمانی که شما به جدول person داده وارد میکنید، کافی است که مقدار null را برای ستون person_id در نظر بگیرید. در این حالت MySQL خودش عدد بعدی را که هنوز در جدول استفاده نشده است، به عنوان مقدار چنین ستونی لحاظ میکند (به صورت پیشفرض برای ستونهای با قابلیت auto-increment، سیستم MySQL از مقدار 1 شروع میکند).
دستور insert
حال که فرآیندهای لازم صورت پذیرفته است، زمان آن است که دادههایی را به جدول وارد کنیم. دستور زیر سطری در جدول person ایجاد میکند که اختصاص به اطلاعات فردی به نام William Turner دارد:
mysql> INSERT INTO person
-> (person_id, fname, lname, eye_color, birth_date)
-> VALUES (null, 'William','Turner', 'BR', '1972-05-27');
Query OK, 1 row affected (0.22 sec)
جمله “Query OK, 1 row affected” به شما اطمینان میدهد که دستور شما از نظر ساختاری1syntax صحیح است و همچنین یک سطر به پایگاه داده اضافه شده است (چرا که ما از دستور insert استفاده کردهایم و وظیفه این دستور نیز همین است). شما میتوانید با اجرای یک دستور select به دادهای که همین الان به جدول وارد شده است، نگاهی بیندازید:
همانطور که میبینید، خود سرور MySQL مقدار 1 را به عنوان کلید اصلی این سطر تولید کرده است. از آنجایی که تنها یک سطر در این جدول موجود است، من از این که تعیین کنم کدام سطر را بررسی کنم (در دستور select)، صرف نظر کردم. با این حال اگر بیش از یک سطر در جدول وجود داشته باشد، به کمک عبارت where میتوانیم تعیین کنیم که تنها اطلاعات مربوط به سطری که ستون person_id آن دارای مقدار 1 است، نمایش داده شود:
درست است که کوئری فوق سطری با مقداری خاص برای ستون کلید اصلی (person_id) را نشان میدهد، اما شما میتوانید هر ستونی در جدول را برای جستجو کردن اطلاعات سطرها در کوئری خود استفاده کنید. در مثال زیر تمامی سطرهایی که مقدار ستون lname آنها برابر Turner باشد، به عنوان خروجی برگردانده میشوند:
نکات مربوط به دستور insert
در اینجا جهت تکمیل کار، لازم است برخی نکات در خصوص دستور insert که استفاده شد، ذکر شوند:
- هیچ مقداری برای ستونهای مرتبط با آدرس فرد، تعیین نشده بود. چنین کاری مشکلی ایجاد نمیکند، زیرا در صورت وارد نکردن اطلاعات، مقادیر ستونها برابر null تنظیم میگردد.
- مقداری که برای ستون birth_date وارد شد، از نوع داده رشتههای کاراکتری بود، نه از نوع تاریخ و زمان. نکته آن، این است که تا هنگامی که رشتههای ورودی شما از فرمتهای مشابه تاریخ و زمان تبعیت کنند، خود MySQL آنها را از نوع داده رشته کاراکتری به نوع داده تاریخ2date تبدیل میکند.
- نام ستونهایی که در دستور ذکر میگردد و مقادیری که برای آنها در نظر گرفته میشود، باید از لحاظ تعداد و نوع با یکدیگر همخوانی داشته باشند. مثلاً اگر شما در دستور insert نام هفت ستون را ذکر کنید، اما تنها شش مقدار را وارد کنید، خطا دریافت خواهید کرد. همچنین است اگر نوع دادههایی که وارد میکنید با نوعی که برای ستون مربوطه در دستور create تعریف کرده بودید، همخوانی نداشته باشد (و قابل تبدیل نیز نباشد).
جمعبندی
بررسی دستور insert برای ورود دادهها به پایگاه داده MySQL به عنوان هدف اصلی این مقاله تعریف شده بود که سعی کردیم با ارائه مثالی مناسب در این خصوص، توضیحات و نکات ضروری را گوشزد کنیم. باید توجه داشت که دستورهای زیادی برای کار با دادهها در سیستم مدیریت پایگاه داده MySQL وجود دارند که علاقهمندان به این زمینه باید به صورت تخصصی به یادگیری آنها بپردازند. امیدواریم که مطالب این مقاله سودمند بوده باشد.
پاورقی:
- 1syntax
- 2date