با سلام و احترام خدمت شما همراهان گرامی روکسو، در این قسمت از سری آموزشی زبان SQL می خواهیم در رابطه با دو مبحث دیگر صحبت کنیم:
Auto-increment در لغت به معنای «افزایش خودکار» است. Auto-increment در پایگاه داده، به ازای وارد شدن هر ردیف جدید در جدول، عددی غیر تکراری و خاص را برای آن می سازد. اکثر اوقات این قابلیت را روی ستونی قرار می دهیم که primary key ما را داشته باشد تا برای هر ردیف جدید یک primary key خاص تولید شود.
مثال زیر ستون Personid را به عنوان ستونی انتخاب می کند که یک primary key از نوع auto-increment باشد:
CREATE TABLE Persons ( Personid int NOT NULL AUTO_INCREMENT, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, PRIMARY KEY (Personid) );
همانطور که می بینید برای ایجاد فیلد افزایش خودکار در MySQL باید از کلیدواژه ی AUTO_INCREMENT
استفاده کنیم. مقدار اولیه ی هر ستون AUTO_INCREMENT
به طور پیش فرض 1 است و برای هر ردیف تازه یک واحد به آن اضافه می کند (بنابراین می شود 1، 2، 3، 4، 5، و ...). اگر بخواهید مقدار اولیه ی آن از 1 نباشد می توانید از این ساختار استفاده کنید:
ALTER TABLE Persons AUTO_INCREMENT=100;
حالا برای ایجاد یک ردیف جدید در جدول Persons دیگر نیازی نداریم که مقدار Personid را به صورت دستی تعیین کنیم. چرا؟ به دلیل اینکه با افزایش خودکار یک مقدار جدید برایش ساخته می شود:
INSERT INTO Persons (FirstName,LastName) VALUES ('Lars','Monsen');
اگر بخواهیم همان مثال قبلی را در SQL Server پیاده کنیم (تعیین ستون Personid به عنوان ستون افزایش خودکار) باید از این ساختار تبعیت کنیم:
CREATE TABLE Persons ( Personid int IDENTITY(1,1) PRIMARY KEY, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int );
همانطور که می بینید برای ایجاد فیلد افزایش خودکار در SQL Server باید از کلیدواژه ی IDENTITY
استفاده کنیم. مقدار اولیه ی هر ستون IDENTITY
به طور پیش فرض 1 است و برای هر ردیف تازه یک واحد به آن اضافه می کند (بنابراین می شود 1، 2، 3، 4، 5، و ...).
اگر بخواهید مقدار اولیه ی آن از 10 شروع شده و 5 واحد 5 واحد، اضافه شود می توانید از این ساختار استفاده کنید:
IDENTITY(10,5)
همچنین دیگر نیازی به وارد کردن مقدار دستی برای IDENTITY
نیست بنابراین برای اضافه کردن یک ردیف جدید می توانیم بگوییم:
INSERT INTO Persons (FirstName,LastName) VALUES ('Lars','Monsen');
پیاده سازی مثال قبلی (تعیین Personid به عنوان فیلد افزایش خودکار) در Access به این شکل است:
CREATE TABLE Persons ( Personid AUTOINCREMENT PRIMARY KEY, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int );
همانطور که می بینید برای تعیین فیلد افزایش خودکار در MS Access باید از کلیدواژه ی AUTOINCREMENT
استفاده کنیم. دقیقا مانند دو پایگاه داده ی قبلی، مقدار اولیه ی AUTOINCREMENT
عدد 1 است و برای هر ردیف جدید 1 واحد 1 واحد، اضافه می شود.
برای آنکه مقدار اولیه از 10 شروع شود و 5 واحد 5 واحد، اضافه شود می توانیم از (AUTOINCREMENT(10,5
استفاده کنیم و خیالمان نیز از بابت تعیین مقدار دستی راحت باشد:
INSERT INTO Persons (FirstName,LastName) VALUES ('Lars','Monsen');
ایجاد فیلد افزایش خودکار در Oracle کمی پیچیده تر از پایگاه های داده ی دیگر است؛ شما باید ابتدا یک فیلد افزایش خودکار ساخته و سپس یک شیء sequence نیز ایجاد کنید (sequence object یک سری خاص از اعداد را می سازد). حالا می توانیم از ساختار زیر استفاده کنیم:
CREATE SEQUENCE seq_person MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 10;
در مثال بالا ابتدا seq_person
را ساخته ایم که یک شیء sequence است و مقدار اولیه ی 1 را دارد. همچنین دستور CACHE
می گوید چند مقدار (عدد) در حافظه ذخیره شوند (مقادیری که در حافظه ذخیره شوند سریعتر قابل دسترسی خواهند بود). در کد بالا:
برای اضافه کردن یک ردیف در این پایگاه داده باید از تابع nextval
استفاده کنیم. کار این تابع دریافت مقدار بعدی از شیء seq_person
است:
INSERT INTO Persons (Personid,FirstName,LastName) VALUES (seq_person.nextval,'Lars','Monsen');
بسیاری از برنامه نویسان کار با تاریخ را کمی پیچیده تر از دیگر قسمت های پایگاه داده می دانند. در واقع سخت ترین قسمت کار با تاریخ این است که مطمئن شوید قالب تاریخی که در جدول هایتان وارد می کنید با قالب تاریخی که برای ستون های جدول تعیین کرده اید یکی باشند. البته تا زمانی که کارمان فقط با تاریخ باشد نباید زیادی نگران شویم اما اگر زمان نیز وارد موضوع شود کار کمی پیچیده تر خواهد شد.
این قالب ها هنگام ساخت یک ستون در جدول هایتان مورد استفاده قرار می گیرند.
فرض کنید که جدول Orders را به این شکل داشته باشیم:
OrderDate | ProductName | OrderId |
2008-11-11 | Geitost | 1 |
2008-11-09 | Camembert Pierrot | 2 |
2008-11-11 | Mozzarella di Giovanni | 3 |
2008-10-29 | Mascarpone Fabioli | 4 |
حالا می خواهیم سفارشاتی انتخاب کنیم که تاریخ "11-11-2008" را داشته باشند. برای این کار دستور زیر را می نویسیم:
SELECT * FROM Orders WHERE OrderDate='2008-11-11'
خروجی ما به این شکل خواهد بود:
OrderDate | ProductName | OrderId |
2008-11-11 | Geitost | 1 |
2008-11-11 | Mozzarella di Giovanni | 3 |
حالا تصور کنید که جدول Orders به این شکل باشد:
OrderDate | ProductName | OrderId |
2008-11-11 13:23:44 | Geitost | 1 |
2008-11-09 15:45:21 | Camembert Pierrot | 2 |
2008-11-11 11:12:01 | Mozzarella di Giovanni | 3 |
2008-10-29 14:56:59 | Mascarpone Fabioli | 4 |
اگر از همان دستور بالا استفاده کنیم و بگوییم:
SELECT * FROM Orders WHERE OrderDate='2008-11-11'
هیچ نتیجه ای به ما نشان داده نخواهد شد. چرا؟ به دلیل اینکه کوئری ما دنبال تاریخی می گردد که زمان نداشته باشد اما در جدول بالا تمام تاریخ ها همراه زمان هستند. برای حل این مشکل دو راه حل وجود دارد:
امیدوارم از این قسمت لذت برده باشید
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.