آموزش SQL
محدودیت SQL DEFAULT؛ مقدار پیش فرض در SQL
نحوه تعریف، تغییر و حذف مقدار پیش فرض در جدول های پایگاه داده
محدودیت SQL DEFAULT راهی برای تعیین مقدار پیش فرض یک ستون است؛ به این ترتیب اگر هنگام درج یک ردیف، برای آن ستون مقداری مشخص نشود، پایگاه داده می تواند مقدار تعیین شده را قرار دهد. در این راهنما با کاربرد DEFAULT، نوشتن دستورهای SQL و تفاوت های مهم میان سامانه های مدیریت پایگاه داده آشنا می شوید.
محدودیت DEFAULT بخشی از تعریف جدول است که برای پر کردن خودکار یک ستون در زمان درج داده به کار می رود. این قابلیت می تواند از ثبت مقادیر خالی یا تکراری جلوگیری کند و ورود اطلاعات را ساده تر سازد؛ البته فقط زمانی که رفتار آن را با نوع داده، دستور INSERT و سامانه پایگاه داده خود هماهنگ کنید.
۱. مقدار پیش فرض چه زمانی استفاده می شود؟
مقدار پیش فرض زمانی وارد عمل می شود که یک ستون در دستور درج داده کنار گذاشته شده باشد یا برای آن از کلمه کلیدی DEFAULT استفاده شود. برای نمونه، اگر ستون City مقدار پیش فرض Sandnes داشته باشد و هنگام درج سفارش یا مشخصات فردی، نام شهر را تعیین نکنید، پایگاه داده می تواند همین مقدار را ثبت کند.
این رفتار با وارد کردن NULL یکسان نیست. اگر دستور INSERT برای ستون مقدار NULL بفرستد، مقدار پیش فرض معمولاً جایگزین آن نمی شود؛ در این حالت ستون NULL می گیرد، مگر آنکه تعریف ستون یا قواعد سامانه مانع این کار شود. بنابراین در برنامه خود مشخص کنید که «نامشخص بودن مقدار» باید با NULL نمایش داده شود یا با یک مقدار پیش فرض.
۲. تعریف DEFAULT هنگام ساخت جدول
می توانید محدودیت DEFAULT را همان زمان ایجاد جدول و در کنار تعریف ستون بنویسید. در مثال زیر، ستون City در صورت حذف از دستور درج، مقدار Sandnes را دریافت می کند. این شیوه برای تنظیمات اولیه و جدول هایی مناسب است که از ابتدا مقدار پیش فرض مشخصی دارند.
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
);
هنگام انتخاب مقدار پیش فرض، نوع ستون را در نظر بگیرید. مقدار متنی باید با کوتیشن نوشته شود، اما مقدار عددی معمولاً بدون کوتیشن می آید. برای ستون های تاریخ نیز باید از تابع یا عبارت سازگار با سامانه پایگاه داده استفاده کنید؛ یک دستور واحد ممکن است در همه سیستم ها اجرا نشود.
۳. استفاده از تابع برای مقدار پیش فرض
در برخی پایگاه های داده می توان از تابع یا عبارت تاریخ و زمان برای تعیین مقدار پیش فرض استفاده کرد. برای مثال، SQL Server از تابع GETDATE() پشتیبانی می کند و می توان تاریخ ثبت سفارش را در زمان ایجاد ردیف تعیین کرد. به این ترتیب لازم نیست برنامه در هر بار ثبت سفارش، زمان جاری را جداگانه ارسال کند.
نام تابع و نوع داده خروجی به سامانه پایگاه داده وابسته است. برای نمونه، GETDATE() در SQL Server کاربرد دارد، در حالی که در PostgreSQL معمولاً از عبارت هایی مانند CURRENT_DATE یا CURRENT_TIMESTAMP استفاده می شود. پیش از انتقال جدول یا اسکریپت به سامانه ای دیگر، سازگاری تابع را بررسی کنید.
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
OrderDate date DEFAULT GETDATE()
);
۴. تفاوت حذف ستون با درج DEFAULT
در دستور INSERT، اگر ستونی را از فهرست ستون ها حذف کنید، مقدار پیش فرض آن ستون قابل استفاده است. همچنین در بسیاری از سامانه ها می توانید برای همان ستون صریحاً DEFAULT بنویسید. این موضوع به ویژه زمانی مفید است که می خواهید برای بیشتر ستون ها مقدار مشخص ارسال کنید، اما یک ستون طبق قاعده جدول مقداردهی شود.
در مثال زیر City از فهرست ستون ها حذف شده است؛ در نتیجه مقدار پیش فرض تعریف شده برای آن اعمال می شود. در برنامه های واقعی، بهتر است فهرست ستون ها را در دستور INSERT به صورت روشن بنویسید تا با تغییر ترتیب ستون های جدول، داده ها به ستون اشتباه وارد نشوند.
INSERT INTO Persons (P_Id, LastName, FirstName)
VALUES (1, 'Smith', 'John');
۵. نام گذاری محدودیت و سازگاری با سامانه پایگاه داده
اگر چند محدودیت در جدول داشته باشید، نام گذاری صریح آن ها مدیریت ساختار را آسان تر می کند. در SQL Server معمولاً DEFAULT به شکل یک محدودیت نام دار تعریف می شود و برای تغییر یا حذف آن باید نام محدودیت را بدانید. در بعضی سامانه ها، دستور ALTER COLUMN برای تنظیم یا حذف مقدار پیش فرض به شکل دیگری نوشته می شود.
به همین دلیل، دستور تغییر یا حذف DEFAULT را بدون تشخیص نوع پایگاه داده کپی نکنید. دستورهایی مانند SET DEFAULT و DROP DEFAULT در برخی سامانه ها معتبرند، اما ممکن است در SQL Server همان دستور اجرا نشود. ابتدا نوع پایگاه داده و نسخه آن را مشخص کنید و سپس نحو رسمی همان سامانه را به کار ببرید.
🎯
درج خودکار
وقتی ستون از دستور درج حذف شود، مقدار پیش فرض می تواند ثبت شود.
🛡️
مقدار معتبر
مقدار پیش فرض مناسب، ورود داده های مورد انتظار را ساده تر می کند.
⚙️
قابل مدیریت
با ALTER TABLE می توانید مقدار پیش فرض را متناسب با نیاز تغییر دهید.
تعریف مقدار پیش فرض در جدول موجود
اگر جدول از قبل ساخته شده باشد، در بسیاری از پایگاه های داده می توانید با دستور ALTER TABLE مقدار پیش فرض یک ستون را تنظیم کنید. نحو دقیق دستور به محصول پایگاه داده بستگی دارد. نمونه زیر از شکل دستوری استفاده می کند که در PostgreSQL پشتیبانی می شود؛ پیش از اجرا، سازگاری آن را با محیط خود بررسی کنید.
ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'Sandnes';
این تغییر، مقدار پیش فرض را برای درج های بعدی تنظیم می کند. به طور معمول، تغییر مقدار پیش فرض باعث بازنویسی خودکار داده های قبلی ستون نمی شود؛ یعنی ردیف های موجود فقط به دلیل تغییر DEFAULT مقدار تازه ای دریافت نمی کنند. اگر لازم است داده های گذشته هم اصلاح شوند، باید آن کار را جداگانه و با دستور UPDATE انجام دهید.
تغییر یا حذف محدودیت DEFAULT
برای تغییر مقدار پیش فرض، معمولاً مقدار جدید را با دستور ALTER TABLE و نحو مخصوص پایگاه داده ثبت می کنید. اگر ستون City پیش تر مقدار Sandnes را داشته باشد، می توانید مقدار را به SANDNES تغییر دهید. تفاوت حروف بزرگ و کوچک در مقدار متنی ممکن است بسته به collation و نوع مقایسه پایگاه داده اهمیت داشته باشد.
ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'SANDNES';
برای حذف مقدار پیش فرض، در PostgreSQL می توان از DROP DEFAULT استفاده کرد. حذف DEFAULT به معنی حذف ستون یا پاک کردن داده های موجود نیست؛ فقط باعث می شود درج های بعدی دیگر آن مقدار را به طور خودکار دریافت نکنند. ستون همچنان از قواعد NULL و سایر محدودیت های تعریف شده پیروی می کند.
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT;
نکته اجرایی
پیش از اجرای دستور، نوع پایگاه داده را بررسی کنید
نحو تغییر و حذف مقدار پیش فرض میان سامانه های پایگاه داده تفاوت دارد؛ اسکریپت را با محیط واقعی خود تطبیق دهید.
مرور محدودیت DEFAULT ←
مقایسه دستورهای رایج DEFAULT
جدول زیر خلاصه ای از کاربرد دستورهای پرکاربرد را نشان می دهد. نمونه های تغییر و حذف ممکن است فقط در سامانه های مشخصی معتبر باشند؛ برای نمونه، SET DEFAULT و DROP DEFAULT در PostgreSQL کاربرد دارند. برای SQL Server، تعریف و حذف محدودیت معمولاً به نام گذاری constraint وابسته است.
| کاربرد |
نمونه دستور یا روش |
نکته |
| تعریف هنگام ساخت جدول |
City varchar(255) DEFAULT 'Sandnes' |
نوع داده و مقدار پیش فرض باید سازگار باشند. |
| درج بدون تعیین ستون |
حذف ستون از فهرست INSERT |
مقدار پیش فرض ستون می تواند اعمال شود. |
| تنظیم مقدار در جدول موجود |
ALTER COLUMN ... SET DEFAULT |
نحو وابسته به سامانه پایگاه داده است. |
| حذف مقدار پیش فرض |
ALTER COLUMN ... DROP DEFAULT |
در برخی سامانه ها از جمله PostgreSQL قابل استفاده است. |
| مقداردهی با تاریخ جاری |
GETDATE() یا عبارت متناظر |
تابع تاریخ و زمان را با موتور پایگاه داده هماهنگ کنید. |
اشتباهات رایج هنگام استفاده از مقدار پیش فرض
اشتباه گرفتن NULL با مقدار پیش فرض
DEFAULT معمولاً زمانی اعمال می شود که ستون از دستور درج حذف شده باشد یا صریحاً DEFAULT درخواست شود. ارسال NULL به جای آن، در بسیاری از موارد NULL را ذخیره می کند. اگر مقدار NULL مجاز نباشد، درج داده ممکن است با خطا روبه رو شود؛ بنابراین رفتار هر ستون را در برنامه و پایگاه داده یکسان تعریف کنید.
فرض کردن سازگاری یکسان میان پایگاه های داده
نام توابع تاریخ، شیوه تعریف constraint و دستورهای ALTER TABLE ممکن است متفاوت باشند. اسکریپتی که برای PostgreSQL نوشته شده، الزاماً در SQL Server یا MySQL اجرا نمی شود. هنگام انتقال پروژه یا نوشتن migration، دستورها را برای موتور مقصد بازبینی کنید.
قرار دادن مقدار پیش فرض نامناسب
مقدار پیش فرض باید معنای واقعی داده را حفظ کند. برای مثال، ثبت مقدار عمومی «نامشخص» برای همه کاربران ممکن است گزارش گیری را دشوار کند، اگر این مقدار با داده واقعی اشتباه گرفته شود. اگر نبود اطلاعات معنای مستقلی دارد، استفاده از NULL یا یک وضعیت مشخص و مستند می تواند انتخاب روشن تری باشد.
۰۱
سهولت
کاهش ورودی های تکراری
برای مقدارهای ثابت، ورود دستی کمتر می شود.
۰۲
یکپارچگی
ثبت مقدار یکسان
قواعد جدول رفتار درج داده را مشخص می کنند.
۰۳
خودکارسازی
ثبت زمان ایجاد
عبارت مناسب می تواند زمان را در پایگاه داده ثبت کند.
۰۴
نگهداری
تنظیم متمرکز
مقدار پیش فرض در تعریف جدول نگهداری می شود.
۰۵
خوانایی
روشن شدن رفتار ستون
تعریف جدول نشان می دهد ستون در نبود ورودی چه می کند.
محدودیت SQL DEFAULT برای زمانی مناسب است که یک ستون در نبود ورودی باید مقدار مشخصی دریافت کند؛ مانند وضعیت اولیه یک رکورد یا زمان ایجاد آن. تعریف مقدار پیش فرض هنگام ساخت جدول یا با ALTER TABLE انجام می شود، اما شیوه دقیق دستور به موتور پایگاه داده وابسته است. همچنین باید تفاوت حذف ستون از INSERT با ارسال NULL را در نظر بگیرید.
پیش از استفاده، نوع داده، معنای مقدار پیش فرض، رفتار NULL و سازگاری تابع های مورد استفاده را بررسی کنید. این نکته ها کمک می کنند ساختار جدول قابل پیش بینی بماند و تغییرات بعدی بدون سردرگمی انجام شوند. در کنار توسعه پایگاه داده، برنامه ریزی درست برای طراحی سایت نیز می تواند به هماهنگی بهتر فرم ها و داده های ذخیره شده کمک کند.
مقدار پیش فرض را متناسب با داده های خود انتخاب کنید
پیش از افزودن یا تغییر DEFAULT، نوع پایگاه داده و رفتار مورد انتظار ستون را بررسی کنید تا درج اطلاعات و نگهداری جدول با اطمینان بیشتری انجام شود.
آشنایی با ساخت جدول ←
سوالات متداول محدودیت SQL DEFAULT
محدودیت DEFAULT در SQL چه کاری انجام می دهد؟
محدودیت DEFAULT برای یک ستون مقدار پیش فرض تعیین می کند. اگر هنگام درج ردیف، آن ستون از دستور INSERT حذف شود یا از کلمه کلیدی DEFAULT استفاده کنید، پایگاه داده می تواند مقدار تعریف شده را ثبت کند.
آیا مقدار پیش فرض با NULL جایگزین می شود؟
معمولاً خیر. اگر به جای حذف ستون، مقدار NULL را صریحاً ارسال کنید، پایگاه داده NULL را دریافت می کند؛ مگر آنکه محدودیت های ستون مانع آن شوند. مقدار پیش فرض را با NULL یکسان در نظر نگیرید.
چطور برای جدول موجود مقدار پیش فرض تعیین کنم؟
با دستور ALTER TABLE می توان مقدار پیش فرض ستون موجود را تغییر داد. نحو دقیق دستور میان سامانه هایی مانند PostgreSQL و SQL Server تفاوت دارد؛ بنابراین نمونه دستور را با موتور پایگاه داده خود تطبیق دهید.
آیا GETDATE() در همه پایگاه های داده کار می کند؟
خیر. GETDATE() تابع شناخته شده SQL Server است و ممکن است در سامانه های دیگر معتبر نباشد. برای هر موتور پایگاه داده از تابع یا عبارت تاریخ و زمان پشتیبانی شده توسط همان سامانه استفاده کنید.
حذف DEFAULT چه اثری روی داده های قبلی دارد؟
حذف مقدار پیش فرض معمولاً فقط رفتار درج های بعدی را تغییر می دهد و داده های موجود ستون را پاک یا بازنویسی نمی کند. برای اصلاح ردیف های قبلی، باید جداگانه از دستور UPDATE استفاده کنید.