AUTO INCREMENT و تاریخ در زبان SQL

19 فروردین 1398
درسنامه درس 26 از سری آموزش زبان SQL
SQL-AUTO-INCREMENT-and-DATE

با سلام و احترام خدمت شما همراهان گرامی روکسو، در این قسمت از سری آموزشی زبان SQL می خواهیم در رابطه با دو مبحث دیگر صحبت کنیم:

  • بحث فیلد های AUTO_INCREMENT یا فیلدهای افزایش خودکار
  • بحث ایجاد و دسترسی به Date یا تاریخ در SQL

AUTO_INCREMENT

Auto-increment در لغت به معنای «افزایش خودکار» است. Auto-increment در پایگاه داده، به ازای وارد شدن هر ردیف جدید در جدول، عددی غیر تکراری و خاص را برای آن می سازد. اکثر اوقات این قابلیت را روی ستونی قرار می دهیم که primary key ما را داشته باشد تا برای هر ردیف جدید یک primary key خاص تولید شود.

در MySQL

مثال زیر ستون 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

اگر بخواهیم همان مثال قبلی را در 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');

در Access

پیاده سازی مثال قبلی (تعیین 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

ایجاد فیلد افزایش خودکار در Oracle کمی پیچیده تر از پایگاه های داده ی دیگر است؛ شما باید ابتدا یک فیلد افزایش خودکار ساخته و سپس یک شیء sequence نیز ایجاد کنید (sequence object یک سری خاص از اعداد را می سازد). حالا می توانیم از ساختار زیر استفاده کنیم:

CREATE SEQUENCE seq_person
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 10;

در مثال بالا ابتدا seq_person را ساخته ایم که یک شیء sequence است و مقدار اولیه ی 1 را دارد. همچنین دستور CACHE می گوید چند مقدار (عدد) در حافظه ذخیره شوند (مقادیری که در حافظه ذخیره شوند سریعتر قابل دسترسی خواهند بود). در کد بالا:

  • MINVALUE 1: یعنی کمترین مقدار 1 باشد.
  • START WITH 1: یعنی از عدد 1 شروع کن. با تغییر این قسمت می توانید مقدار اولیه را تغییر دهید.
  • INCREMENT BY 1: یعنی 1 واحد 1 واحد اضافه کن.
  • CACHE 10: یعنی تا 10 عدد در حافظه ذخیره شوند.

برای اضافه کردن یک ردیف در این پایگاه داده باید از تابع nextval استفاده کنیم. کار این تابع دریافت مقدار بعدی از شیء seq_person است:

INSERT INTO Persons (Personid,FirstName,LastName)
VALUES (seq_person.nextval,'Lars','Monsen');

Date یا تاریخ

بسیاری از برنامه نویسان کار با تاریخ را کمی پیچیده تر از دیگر قسمت های پایگاه داده می دانند. در واقع سخت ترین قسمت کار با تاریخ این است که مطمئن شوید قالب تاریخی که در جدول هایتان وارد می کنید با قالب تاریخی که برای ستون های جدول تعیین کرده اید یکی باشند. البته تا زمانی که کارمان فقط با تاریخ باشد نباید زیادی نگران شویم اما اگر زمان نیز وارد موضوع شود کار کمی پیچیده تر خواهد شد.

نوع داده ی date در پایگاه های داده

  • برای MySQL باید طبق این قالب عمل کنید:
    • DATE - format YYYY-MM-DD
    • DATETIME - format: YYYY-MM-DD HH:MI:SS
    • TIMESTAMP - format: YYYY-MM-DD HH:MI:SS
    • YEAR - format YYYY or YY
  • اما برای SQL Server این قالب معتبر است:
    • DATE - format YYYY-MM-DD
    • DATETIME - format: YYYY-MM-DD HH:MI:SS
    • SMALLDATETIME - format: YYYY-MM-DD HH:MI:SS
    • TIMESTAMP - format: a unique number

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

کار با تاریخ در SQL

فرض کنید که جدول 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'

هیچ نتیجه ای به ما نشان داده نخواهد شد. چرا؟ به دلیل اینکه کوئری ما دنبال تاریخی می گردد که زمان نداشته باشد اما در جدول بالا تمام تاریخ ها همراه زمان هستند. برای حل این مشکل دو راه حل وجود دارد:

  • کوئری های خود را طبق قالب هایی که بالاتر گفته شد بنویسید و یک بار آن ها را تست کنید.
  • زمان را در ستون تاریخ قرار ندهید؛ یا به طور کل زمان را ذخیره نکنید و یا آن را در یک ستون جداگانه قرار دهید که البته کارتان را کمی سخت می کند.

امیدوارم از این قسمت لذت برده باشید

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش زبان SQL توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.