آموزش جامع دستور INSERT در SQL Server: درج دادههای هوشمندانه
دستور INSERT
در SQL Server برای افزودن یک یا چند ردیف جدید از دادهها به یک جدول در پایگاه داده مورد استفاده قرار میگیرد. این دستور جزء گروه دستورات تغییر داده (DML) است و به شما امکان میدهد اطلاعات جدیدی را به ساختار جدول موجود خود اضافه کنید.
ساختار کلی دستور INSERT INTO
برای درج دادهها به صورت زیر است:
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
این ساختار پایه نشان میدهد که چگونه میتوان با مشخص کردن نام جدول، ستونهای هدف و مقادیر متناظر، یک ردیف جدید را وارد کرد. در ادامه، سناریوهای مختلف درج داده با دستور INSERT
و مثالهای کاربردی آن را بررسی میکنیم.
ابتدا یک جدول نمونه برای استفاده در مثالها ایجاد میکنیم:
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
FirstName NVARCHAR(50),
LastName NVARCHAR(50),
Department NVARCHAR(50),
HireDate DATE
);
این جدول شامل اطلاعات پایه کارمندان از جمله شناسه، نام، نام خانوادگی، بخش و تاریخ استخدام است.
برای درج یک ردیف ساده با مشخص کردن تمام مقادیر ستونها، میتوانید از دستور زیر استفاده کنید:
INSERT INTO Employees (EmployeeID, FirstName, LastName, Department, HireDate)
VALUES (1, 'Ali', 'Mohammadi', 'IT', '2023-01-15');
در این مثال، تمام ستونها به ترتیب مقادیر مشخص شده پر میشوند. این روش رایجترین راه برای درج یک ردیف کامل در یک جدول است.
اگر بخواهید دادهها را تنها در ستونهای خاصی از جدول درج کنید و ستونهای دیگر مقادیر پیشفرض یا NULL داشته باشند، میتوانید نام ستونها را به صراحت ذکر کنید:
INSERT INTO Employees (EmployeeID, FirstName, LastName)
VALUES (2, 'Sara', 'Ahmadi');
در این حالت، ستونهای Department
و HireDate
چون مقداری برای آنها مشخص نشده، یا با مقدار NULL
پر میشوند (در صورتی که اجازه NULL
را داشته باشند) یا با مقدار پیشفرض تعریف شده برای آنها (اگر وجود داشته باشد).
یکی از قابلیتهای قدرتمند دستور INSERT
، امکان درج داده از نتیجه یک دستور SELECT
است. این برای کپی کردن دادهها از یک جدول به جدول دیگر یا فیلتر کردن و درج زیرمجموعهای از دادهها بسیار مفید است:
INSERT INTO Employees (EmployeeID, FirstName, LastName, Department, HireDate)
SELECT EmployeeID, FirstName, LastName, Department, HireDate
FROM OldEmployees
WHERE Department = 'HR';
در این مثال، دادههای مربوط به کارمندان بخش منابع انسانی (HR) از جدول OldEmployees
انتخاب شده و به جدول Employees
درج میشوند. این روش برای انتقال دادهها بین جداول یا یکپارچهسازی اطلاعات استفاده میشود.
زمانی که ستونی در جدول دارای مقدار پیشفرض (DEFAULT
) باشد، میتوانید هنگام درج ردیف، به جای مشخص کردن صریح مقدار آن ستون، از کلمه کلیدی DEFAULT
استفاده کنید:
-- فرض کنید ستون Department مقدار پیش فرض 'Unknown' دارد
ALTER TABLE Employees ADD CONSTRAINT DF_Department DEFAULT 'Unknown' FOR Department;
INSERT INTO Employees (EmployeeID, FirstName, LastName, HireDate, Department)
VALUES (3, 'Reza', 'Karimi', '2024-03-01', DEFAULT);
در این حالت، مقدار 'Unknown'
که به عنوان پیشفرض برای ستون Department
تعریف شده است، به صورت خودکار درج میشود.
برای ستونهای IDENTITY
که مقادیر آنها به صورت خودکار توسط SQL Server تولید میشوند، نیازی به درج صریح مقدار نیست. در واقع، سیستم به صورت خودکار عدد بعدی را تخصیص میدهد:
-- ایجاد یک جدول جدید با ستون IDENTITY
CREATE TABLE Products (
ProductID INT IDENTITY(1,1) PRIMARY KEY,
ProductName NVARCHAR(100),
Price MONEY
);
INSERT INTO Products (ProductName, Price)
VALUES ('Laptop', 1200.00);
در این مثال، ProductID
به صورت خودکار توسط SQL Server مقداردهی میشود و نیازی به درج آن در دستور INSERT
نیست. این ستون برای ایجاد شناسههای منحصر به فرد (Unique IDs) بسیار کاربردی است.
دستور OUTPUT
در SQL Server به شما امکان میدهد اطلاعات ردیفهای درج شده را بلافاصله پس از عملیات INSERT
بازیابی کنید. این اطلاعات میتواند شامل مقادیر ستونهای IDENTITY
یا هر ستون دیگری باشد:
INSERT INTO Products (ProductName, Price)
OUTPUT INSERTED.ProductID, INSERTED.ProductName
VALUES ('Keyboard', 75.00);
این دستور پس از درج ردیف، ProductID
و ProductName
ردیف درج شده را به عنوان خروجی برمیگرداند. این قابلیت برای لاگبرداری، گزارشدهی یا استفاده از شناسههای جدید در عملیات بعدی مفید است.
با استفاده از کلمه کلیدی TOP
در دستور INSERT
، میتوانید تعداد ردیفهایی را که از نتیجه یک دستور SELECT
درج میشوند، محدود کنید. این قابلیت برای درج تنها چند ردیف اول از یک مجموعه داده بزرگ مفید است:
-- فرض کنید یک جدول SourceData دارید
CREATE TABLE SourceData (
SourceID INT,
SourceName NVARCHAR(50),
SourceValue INT
);
INSERT INTO SourceData VALUES (1, 'A', 10), (2, 'B', 20), (3, 'C', 30), (4, 'D', 40);
-- درج 2 ردیف اول از SourceData به Products (برای مثال)
INSERT TOP (2) INTO Products (ProductName, Price)
SELECT SourceName, SourceValue
FROM SourceData
ORDER BY SourceID;
در این مثال، تنها دو ردیف اول از نتیجه SELECT
، بر اساس ترتیب SourceID
، در جدول Products
درج میشوند. این کاربرد برای درج نمونهای از دادهها یا تقسیمبندی درجهای بزرگ مناسب است.