جدولها: ساخت، تغییر و مدیریت ساختار داده
در درس قبل یاد گرفتیم پایگاهداده یک «ظرف» است که جدولها و سایر اشیاء را کنار هم نگه میدارد. حالا وقتش رسیده وارد خودِ جدولها شویم: دقیقاً چطور ساخته میشوند، چه قوانینی میتوان روی ستونهایشان گذاشت، چطور بعداً تغییرشان داد، و چطور با خیال راحت حذفشان کرد.
جدول دقیقاً چیست؟
یک جدول، مثل یک صفحهی اکسل از ردیفها (rows) و ستونها (columns) تشکیل شده — اما با یک تفاوت مهم: بر خلاف اکسل که میتوانی هر جور دادهای را در هر خانه بنویسی، یک جدول در SQL Server از همان لحظهی ساخت، یک ساختار مشخص و اجباری دارد. تو تعیین میکنی هر ستون چه نامی دارد و چه نوع دادهای باید در آن قرار بگیرد؛ از آن پس، SQL Server خودش تضمین میکند هیچ ردیفی از این ساختار خارج نشود.
ساخت یک جدول ساده (CREATE TABLE)
CREATE TABLE Students ( StudentID INT, FullName NVARCHAR(100), City NVARCHAR(50), Grade INT );
هر خط داخل پرانتز، یک ستون را تعریف میکند: نام ستون و بهدنبالش نوع دادهای که مجاز است در آن ذخیره شود. مثلاً INT یعنی عدد صحیح، و NVARCHAR(100) یعنی متنی با حداکثر ۱۰۰ نویسه. جزئیات کامل انواع داده را در درس بعدی میبینیم؛ فعلاً فقط با شکل کلی آشنا میشویم.
NVARCHAR استفاده کن، نه VARCHAR. حرف N یعنی این ستون از Unicode پشتیبانی میکند؛ بدون آن، حروف فارسی ممکن است بهدرستی ذخیره نشوند.محدودیتها روی ستونها (Constraints)
معمولاً میخواهیم روی دادهی هر ستون قوانینی هم اعمال کنیم. رایجترین این قوانین عبارتاند از:
- NOT NULL: این ستون هرگز نباید خالی بماند.
- DEFAULT: اگر مقداری برای این ستون داده نشود، این مقدار پیشفرض استفاده میشود.
- PRIMARY KEY: شناسهی یکتای هر ردیف؛ نه میتواند تکراری باشد، نه خالی. (بهطور کامل در فصل ۴ بررسی میشود.)
- UNIQUE: مقدار این ستون باید در کل جدول یکتا باشد، اما بر خلاف PRIMARY KEY، هر جدول میتواند چند ستون UNIQUE داشته باشد.
- CHECK: یک شرط دلخواه که هر مقدار ورودی باید آن را رعایت کند.
CREATE TABLE Students ( StudentID INT PRIMARY KEY, FullName NVARCHAR(100) NOT NULL, City NVARCHAR(50) DEFAULT N'تهران', Grade INT CHECK (Grade BETWEEN 1 AND 12), NationalCode NVARCHAR(10) UNIQUE );
با این تعریف، اگر کسی بخواهد دانشآموزی بدون نام ثبت کند، یا کد ملی تکراری وارد کند، یا نمرهی پایهای خارج از بازهی ۱ تا ۱۲ بدهد، SQL Server خودش با خطا جلوی آن را میگیرد — بدون اینکه لازم باشد این بررسیها را در برنامهی خودت پیاده کنی.
ستون شمارندهی خودکار (IDENTITY)
معمولاً نمیخواهیم خودمان برای هر ردیف جدید یک شناسهی یکتا انتخاب کنیم. ستون IDENTITY این کار را خودکار میکند:
CREATE TABLE Students ( StudentID INT IDENTITY(1,1) PRIMARY KEY, FullName NVARCHAR(100) NOT NULL ); INSERT INTO Students (FullName) VALUES (N'علی محمدی'); -- StudentID بهطور خودکار برابر 1 میشود، بعدی 2، و همینطور ادامه پیدا میکند
IDENTITY(1,1) یعنی شمارش از عدد ۱ شروع شود و هر بار ۱ واحد افزایش پیدا کند. دیگر لازم نیست هنگام درج ردیف جدید، مقداری برای این ستون مشخص کنی.
تغییر ساختار جدول (ALTER TABLE)
جدولها بعد از ساخت هم قابل تغییرند — اضافهکردن ستون جدید، تغییر نوع یک ستون، یا حذف یک ستون:
-- اضافه کردن یک ستون جدید ALTER TABLE Students ADD Email NVARCHAR(100); -- تغییر نوع یک ستون موجود ALTER TABLE Students ALTER COLUMN Email NVARCHAR(150); -- حذف یک ستون ALTER TABLE Students DROP COLUMN Email;
حذف جدول یا فقط خالی کردنش
سه دستور مختلف وجود دارد که ممکن است باهم اشتباه گرفته شوند:
| دستور | چهکاری میکند | قابل بازگشت؟ |
|---|---|---|
DROP TABLE | حذف کامل جدول، هم ساختار و هم دادهها | خیر |
TRUNCATE TABLE | خالیکردن سریع همهی ردیفها؛ ساختار جدول باقی میماند | خیر |
DELETE FROM | حذف ردیفها یکییکی، قابل فیلتر با WHERE (کامل در فصل ۶) | بسته به تراکنش |
DROP TABLE Students; کل جدول را برای همیشه از بین میبرد. پیش از اجرای آن در محیط واقعی، همیشه مطمئن شو داری روی محیط درستی کار میکنی.دیدن ساختار یک جدول
برای دیدن اینکه یک جدول دقیقاً چه ستونهایی با چه نوع دادهای دارد، دو راه رایج وجود دارد:
EXEC sp_help 'Students'; -- یا، به روشی که در همهی پایگاهدادههای رابطهای یکسان کار میکند: SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Students';
INFORMATION_SCHEMA یک استاندارد است که تقریباً همهی DBMSهای رابطهای (نه فقط SQL Server، بلکه MySQL و PostgreSQL هم) پشتیبانی میکنند — یعنی این دانش، قابلانتقال به هر پایگاهدادهی دیگری هم هست.
نامگذاری جدول و مفهوم Schema
هر جدول در SQL Server درواقع زیر یک Schema قرار دارد که پیشفرضش dbo است؛ به همین دلیل ممکن است نام کامل جدول را بهصورت dbo.Students هم ببینی. Schema را میتوان مثل یک پوشهی سازماندهنده در نظر گرفت که جدولهای مرتبط را زیر یک نام مشترک گروهبندی میکند (مثلاً Sales.Orders در برابر HR.Employees).
در مورد نامگذاری، قانون رسمی سختگیرانهای وجود ندارد، اما رعایت یک قاعدهی یکدست در کل پروژه مهم است — مثلاً همیشه از حالت مفرد (Student) یا همیشه جمع (Students) استفاده کن، نه ترکیبی از هر دو.
جدولها در Playground این سایت
خبر خوب این است که دستور CREATE TABLE در SQLite (موتور Playground این سایت) تقریباً همان ساختار را دارد. تنها تفاوت مهم اینجاست: کافی است یک ستون را INTEGER PRIMARY KEY تعریف کنی تا خودش، بدون نیاز به کلمهی IDENTITY، بهصورت خودکار شمارهگذاری شود.
حالا نوبت توست. تا اینجا همیشه روی جدولهای ازپیشساختهشده پرسوجو زدهای؛ اینبار بیا خودت از صفر یک جدول بسازی، چند ردیف داخلش بریزی، و در همان لحظه نتیجه را ببینی:
جمعبندی این درس
- جدول از ستونهایی با نام و نوع دادهی مشخص تشکیل شده و با
CREATE TABLEساخته میشود. - محدودیتهای رایج شامل
NOT NULL،DEFAULT،PRIMARY KEY،UNIQUEوCHECKهستند. IDENTITYشمارهگذاری خودکار یک ستون (معمولاً کلید اصلی) را انجام میدهد.- با
ALTER TABLEمیتوان ستون اضافه، تغییر یا حذف کرد؛ باDROP TABLEکل جدول حذف میشود. INFORMATION_SCHEMA.COLUMNSراهی استاندارد برای دیدن ساختار هر جدول است.
در درس بعدی، عمیقتر به سراغ خودِ انواع داده میرویم: تفاوت INT، DECIMAL، NVARCHAR، DATE و بقیهی انواع رایج، و اینکه کِی از کدامشان استفاده کنیم.