خانه/ مبانی پایگاه داده/ جدول‌ها

جدول‌ها: ساخت، تغییر و مدیریت ساختار داده

مبتدی ۱۲ دقیقه مطالعه

در درس قبل یاد گرفتیم پایگاه‌داده یک «ظرف» است که جدول‌ها و سایر اشیاء را کنار هم نگه می‌دارد. حالا وقتش رسیده وارد خودِ جدول‌ها شویم: دقیقاً چطور ساخته می‌شوند، چه قوانینی می‌توان روی ستون‌هایشان گذاشت، چطور بعداً تغییرشان داد، و چطور با خیال راحت حذفشان کرد.

جدول دقیقاً چیست؟

یک جدول، مثل یک صفحه‌ی اکسل از ردیف‌ها (rows) و ستون‌ها (columns) تشکیل شده — اما با یک تفاوت مهم: بر خلاف اکسل که می‌توانی هر جور داده‌ای را در هر خانه بنویسی، یک جدول در SQL Server از همان لحظه‌ی ساخت، یک ساختار مشخص و اجباری دارد. تو تعیین می‌کنی هر ستون چه نامی دارد و چه نوع داده‌ای باید در آن قرار بگیرد؛ از آن پس، SQL Server خودش تضمین می‌کند هیچ ردیفی از این ساختار خارج نشود.

ساخت یک جدول ساده (CREATE TABLE)

sql
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: یک شرط دلخواه که هر مقدار ورودی باید آن را رعایت کند.
sql
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 این کار را خودکار می‌کند:

sql
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)

جدول‌ها بعد از ساخت هم قابل تغییرند — اضافه‌کردن ستون جدید، تغییر نوع یک ستون، یا حذف یک ستون:

sql
-- اضافه کردن یک ستون جدید
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; کل جدول را برای همیشه از بین می‌برد. پیش از اجرای آن در محیط واقعی، همیشه مطمئن شو داری روی محیط درستی کار می‌کنی.

دیدن ساختار یک جدول

برای دیدن این‌که یک جدول دقیقاً چه ستون‌هایی با چه نوع داده‌ای دارد، دو راه رایج وجود دارد:

sql
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 و بقیه‌ی انواع رایج، و این‌که کِی از کدام‌شان استفاده کنیم.