خوش آموز درخت تو گر بار دانش بگیرد، به زیر آوری چرخ نیلوفری را


افزودن Primary Key به یک جدول موجود در SQL Server

افزودن Primary Key به یک جدول موجود در SQL Server
در این مقاله نحوه افزودن primary key به یک جدولی که در SQL Server موجود است، با استفاده از Transact-SQL نشان داده شده است. primary key ستونی است که به عنوان شناسه منحصر به فرد جدول، پیکربندی شده است. هنگام ایجاد جدول ، معمولاً یک primary key هم ایجاد می کنند ولی اگر جدول از قبل هم وجود داشته باشد، باز هم می توانید primary key بدان اضافه کنید.

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


همچنین کلیدهای اصلی فقط می توانند به ستونهایی اضافه شوند که به صورت NOT NULL تعریف شده اند.

Add a Primary Key Constraint

فرض بر اینکه جدولی ایجاد شده و به هر دلیلی برای آن Primary Key وجود ندارد، هم از طریق object Explorer و هم از طریق دستورات T-SQL می توانید کلید اصلی را به یکی از فیلدهای جدول اضافه کنید که ما در اینجا از طریق دستورات اقدام به اینکار خواهیم کرد.
ابتدا یک جدول ایجاد می کنیم(بدون کلی اصلی).

USE Test;

CREATE TABLE Colors
(
ColorId int IDENTITY (1,1) NOT NULL,
ColorName varchar(50)
);

Commands completed successfully.
Total execution time: 00:00:00.058

خب حالا می خواهیم primary key را به جدول اضافه کنیم.

ALTER TABLE Colors
ADD CONSTRAINT PK_Colors_ColorId PRIMARY KEY CLUSTERED (ColorId);

Commands completed successfully.
Total execution time: 00:00:00.031

همانطور که مشاهده می کنید برای ستون ColorId، یک primary key اضافه دشه است.

Check the Primary Key Constraint

برای لیست کردن تمامی primary key های یک پایگاه داده از اسکریپت زیر می توانید استفاده کنید:

SELECT
name,
type,
unique_index_id,
is_system_named
FROM sys.key_constraints
WHERE type = 'PK';

+------------------------------+--------+-------------------+-------------------+
| name | type | unique_index_id | is_system_named |
|------------------------------+--------+-------------------+-------------------|
| PK__MyTest__606C418F16F9CCCF | PK | 1 | 1 |
| PK__Client__96ADCE1ACB91C2A9 | PK | 1 | 1 |
| PK_Colors_ColorId | PK | 1 | 0 |
+------------------------------+--------+-------------------+-------------------+

Adding a Primary Key to a Column that allows NULL Values

یک primary key را تنهاب می توان به ستون هایی که NOT NULL هستند، اعمال کرد. اگر درصدد این باشید به ستونی که قابل Null است، primary key دهید، با خطا مواجه خواهید شد.
برای اینکه این موضوع را با هم ببینیم، یک جدول ایجاد می کنیم و این بار ستون را بصورت NOT NULL ایجاد نمی کنیم.
USE Test;

CREATE TABLE Colors2
(
ColorId int,
ColorName varchar(50)
);

با اجرای دستور زیر می توانید ببینید که فیلد قابلیت درج Null را دارد یا خیر. این کوئری برای جدول قبلی و هم جدولی که هم اکنون ایجاد کردیم، می باشد:

SELECT
t.name AS 'Table',
c.name AS 'Column',
c.is_nullable,
c.is_identity
FROM sys.columns c
INNER JOIN sys.tables T
ON c.object_id = t.object_id
WHERE c.name = 'ColorId';

+---------+----------+---------------+---------------+
| Table | Column | is_nullable | is_identity |
|---------+----------+---------------+---------------|
| Colors | ColorId | 0 | 1 |
| Colors2 | ColorId | 1 | 0 |
+---------+----------+---------------+---------------+

ستون Colorid که در جدول Colors ایجاد کردیم، ستون شناسه بوده و NOT NULL می باشد و در حین حال مشاهده می کنید که ستون colorid در جدول colors2 اینطور نیست.
خب، حالا می خواهیم که یک primary key به این ستون که قابلیت NULL دارد اضافه کنیم.

ALTER TABLE Colors2
ADD CONSTRAINT PK_Colors2_ColorId PRIMARY KEY CLUSTERED (ColorId);

Msg 8111, Level 16, State 1, Line 1
Cannot define PRIMARY KEY constraint on nullable column in table 'Colors2'.
Msg 1750, Level 16, State 0, Line 1
Could not create constraint or index. See previous errors.

خب، همانطور که مشاهده می کنید، نمی توانیم Primary Key به چنین ستونی تخصیص دهیم و باید را بصورت NOT NULL تعریف کنیم. برای تنظیم این ستون بصورت NOT NULL می توانیم از ALTER COLUMN در یک دستور ALTER TABLE استفاده کنیم:

ALTER TABLE Colors2
ALTER COLUMN ColorId int NOT NULL;

دوباره وضعیت ستون را بررسی میکنیم:

SELECT
t.name AS 'Table',
c.name AS 'Column',
c.is_nullable,
c.is_identity
FROM sys.columns c
INNER JOIN sys.tables T
ON c.object_id = t.object_id
WHERE c.name = 'ColorId';

+---------+----------+---------------+---------------+
| Table | Column | is_nullable | is_identity |
|---------+----------+---------------+---------------|
| Colors | ColorId | 0 | 1 |
| Colors2 | ColorId | 0 | 0 |
+---------+----------+---------------+---------------+

همانطور که مشاهده می کنید، فیلد colorid اکنون NOT NULL بوده و حالا می توان primary key را بدان اضافه کرد.

ALTER TABLE Colors2
ADD CONSTRAINT PK_Colors2_ColorId PRIMARY KEY CLUSTERED (ColorId);

Commands completed successfully.
Total execution time: 00:00:00.048

برای چک کردن دوباره تمامی primary key ها باز از دستور زیر باید استفاده کیند:

SELECT
name,
type,
unique_index_id,
is_system_named
FROM sys.key_constraints
WHERE type = 'PK';

+------------------------------+--------+-------------------+-------------------+
| name | type | unique_index_id | is_system_named |
|------------------------------+--------+-------------------+-------------------|
| PK__MyTest__606C418F16F9CCCF | PK | 1 | 1 |
| PK__Client__96ADCE1ACB91C2A9 | PK | 1 | 1 |
| PK_Colors_ColorId | PK | 1 | 0 |
| PK_Colors2_ColorId | PK | 1 | 0 |
+------------------------------+--------+-------------------+-------------------+

همانطور که مشاهده می کنید، اکنون PK_Colors2_ColorId به عنوان primary key به جدول مورد نظر اضافه شده است.

Altering a Column to be an Identity Column

اگر ستونی را قبلا در جدول ایجاد کرده باشید، نمیتوانید آن را identity کنید وگرنه با خطا مواجه می شوید. می توانید ستونی که identity است را Primary key کنید ولی بر عکس آن امکان پذیر نیست. لطفا به اسکریپت زیر دقت کنید:

ALTER TABLE Colors2
ALTER COLUMN
ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY;

Msg 156, Level 15, State 1, Line 3
Incorrect syntax near the keyword 'IDENTITY'.


نمایش دیدگاه ها (0 دیدگاه)

دیدگاه خود را ثبت کنید:

انتخاب تصویر ویرایش حذف
توجه! حداکثر حجم مجاز برای تصویر 500 کیلوبایت می باشد.


دسته بندی مطالب خوش آموز