# Primary key

Ushbu qo'llanmada biz sizga asosiy kalit nima ekanligini va SQL bayonotlari orqali PostgreSQL primary key cheklovlarini qanday boshqarishni ko'rsatamiz.

`Primary key`(asosiy kalit) - bu jadvaldagi satrni yagona aniqlash uchun ishlatiladigan ustun yoki ustunlar guruhi.

Siz primary keylarni primary key cheklovlar orqali aniqlaysiz. Texnik jihatdan, primary key `null` boʻlmagan cheklov va `UNIQUE` cheklovning kombinatsiyasi hisoblanadi.

Jadvalda bitta va faqat bitta primary key bo'la oladi. Har bir jadvalga primary keyni qo'shish yaxshi amaliyotdir. Jadvalga primary key qo'shsangiz, PostgreSQL ustunda noyob `B-tree indeksini` yoki `primary key`ni aniqlash uchun foydalaniladigan ustunlar guruhini yaratadi.

Odatda, biz `CREATE TABLE` iborasi yordamida jadval tuzilishini aniqlaganimizda, jadvalga primary keyni qo'shamiz.

```sql
CREATE TABLE TABLE (
	column_1 data_type PRIMARY KEY,
	column_2 data_type,
	…
);
```

Quyidagi bayonot `po_headers` nomi bilan xarid buyurtmasi (PO-purchase order) sarlavhalari jadvalini yaratadi.

```sql
CREATE TABLE po_headers (
	po_no INTEGER PRIMARY KEY,
	vendor_no INTEGER,
	description TEXT,
	shipping_address TEXT
);
```

`po_no` - `po_headers` jadvalining primary keyi bo'lib, u `po_headers` jadvalidagi xarid tartibini noyob tarzda aniqlaydi.

Agar primary key ikki yoki undan ortiq ustundan iborat bo'lsa, siz primary key cheklovini quyidagicha belgilaysiz:

```sql
CREATE TABLE TABLE (
	column_1 data_type,
	column_2 data_type,
	… 
        PRIMARY KEY (column_1, column_2)
);
```

Masalan, quyidagi bayonot xarid buyurtmasi satrlari jadvalini yaratadi, uning primary keyi xarid buyurtmasi raqami ( `po_no`) va qator elementi raqami ( `item_no`) kombinatsiyasidan iborat.

```sql
CREATE TABLE po_items (
	po_no INTEGER,
	item_no INTEGER,
	product_no INTEGER,
	qty INTEGER,
	net_price NUMERIC,
	PRIMARY KEY (po_no, item_no)
);
```

Agar siz birlamchi kalit cheklovi nomini aniq belgilamasangiz, PostgreSQL primary key chekloviga standart nom tayinlaydi. Odatiy bo'lib, PostgreSQL primary key cheklovi uchun standart nom sifatida `table-name_pkey` dan foydalanadi. Ushbu misolda PostgreSQL `po_items` jadvali uchun `po_items_pkey` nomi bilan primary key cheklovini yaratadi.

Agar siz primary key cheklovi nomini belgilamoqchi boʻlsangiz, `CONSTRAINT` bandidan quyidagi tarzda foydalanasiz:

```sql
CONSTRAINT constraint_name PRIMARY KEY(column_1, column_2,...);
```

## Mavjud jadval tuzilmasini o'zgartirishda primary keyni aniqlash

Mavjud jadval uchun primary keyni aniqlash kamdan-kam uchraydi. Agar buni qilish kerak bo'lsa, primary key cheklovini qo'shish uchun `ALTER TABLE` iborasidan foydalanishingiz mumkin.

```sql
ALTER TABLE table_name ADD PRIMARY KEY (column_1, column_2);
```

Quyidagi bayonot hech qanday primary keyni belgilamasdan `products` nomli jadval yaratadi.

```sql
CREATE TABLE products (
	product_no INTEGER,
	description TEXT,
	product_cost NUMERIC
);
```

Siz `mahsulotlar` jadvaliga primary key cheklovini qo'shmoqchi bo'lsangiz, quyidagi bayonotni bajarishingiz mumkin:

```sql
ALTER TABLE products 
ADD PRIMARY KEY (product_no);
```

## Mavjud jadvalga avtomatik ravishda oshirilgan primary keyni qanday qo'shish mumkin

Aytaylik, bizda primary keyga ega bo'lmagan `vendors` jadvali bor.

```sql
CREATE TABLE vendors (name VARCHAR(255));
```

Va biz `INSERT` iborasi yordamida `vendors` jadvaliga bir nechta qatorlarni qo'shamiz:

```sql
INSERT INTO vendors (NAME)
VALUES
	('Microsoft'),
	('IBM'),
	('Apple'),
	('Samsung');
```

Qo'shish amalini tekshirish uchun quyidagi `SELECT` iborasi yordamida `vendors` jadvalidagi ma'lumotlarni so'raymiz:

```sql
SELECT
	*
FROM
	vendors;
```

![vendors table](https://www.postgresqltutorial.com/wp-content/uploads/2015/08/vendors-table.jpg)

Endi, agar biz `vendors` jadvaliga `id` nomli primary keyni qo'shishni istasak va `id` maydoni avtomatik ravishda bittaga ko'paytirilsa, biz quyidagi bayonotdan foydalanamiz:

```sql
ALTER TABLE vendors ADD COLUMN ID SERIAL PRIMARY KEY;
```

Keling, `vendors` jadvalini yana bir bor tekshiramiz.

```sql
SELECT
	id,name
FROM
	vendors;
```

![vendors table](https://www.postgresqltutorial.com/wp-content/uploads/2015/08/vendors-table-with-primary-key.jpg)

## Primary keyni olib tashlash

Mavjud primary key cheklovini olib tashlash uchun siz quyidagi sintaksis bilan `ALTER TABLE` iborasidan ham foydalanasiz.

```sql
ALTER TABLE table_name DROP CONSTRAINT primary_key_constraint;
```

Masalan, `mahsulotlar` jadvalidagi primary keyni olib tashlash uchun siz quyidagi bayonotdan foydalanasiz:

```sql
ALTER TABLE products
DROP CONSTRAINT products_pkey;
```

Ushbu qo'llanmada siz `CREATE TABLE` va `ALTER TABLE` iboralari yordamida primary key cheklovlarini qanday qo'shish va olib tashlashni o'rgandingiz.

© [postgresqltutorial.com](https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-primary-key/)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://postgres.realtemirov.uz/basic/understanding-postgresql-constraints/primary-key.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
