Təsəvvür elə, universitet üçün tələbə cədvəli yaradırsan. Yenə! :)
Əvvəlcə qərara gəlirsən ki, yaş üçün age sahəsi tam ədəd olacaq və SMALLINT tipini verirsən (bu, -32,768-dən 32,767-ə qədər olan ədədlər üçündür). Amma bir müddət sonra, database böyüyür və başqa ölkələrdən olan tələbələr haqqında məlumat əlavə edirsən, onlar isə yaşlarını... doğumdan keçən günlərlə göstərirlər! Burda artıq sənin SMALLINT dar gəlir — vaxtdır, məsələn, INTEGER-ə keçəsən.
Budur, data type dəyişmək lazım olan bir neçə tipik hal:
- Ədədlərin diapazonunu artırmaq və ya azaltmaq.
- Sətirlərin uzunluğunu dəyişmək (məsələn,
VARCHAR(50)-dənVARCHAR(100)-ə keçmək). - Optimallaşdırma üçün başqa data type-a keçmək (məsələn,
TEXT-iVARCHAR-a çevirmək). - Sütunun tipini səhv seçmisən (məsələn,
BOOLEANyazmısan, amma əslindəINTEGERolmalı idi).
Data type dəyişmək üçün komanda sintaksisi
PostgreSQL-də sütunun data type-ını dəyişmək üçün ALTER TABLE komandası istifadə olunur. Bu, cədvəlin strukturunu yeni tələblərə uyğunlaşdırmağa imkan verir.
ALTER TABLE table_name
ALTER COLUMN column_name TYPE new_data_type;
Burda hər şey sadədir: cədvəlin adını, dəyişmək istədiyin sütunu və yeni data type-ı göstərirsən.
Nümunə 1: INTEGER-dən BIGINT-ə keçid
Tutaq ki, tələbələr üçün cədvəlin var:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
age INTEGER
);
Hər şey yaxşı idi, yaş milyon illəri keçməyənə qədər (soruşma, bu sadəcə nümunədir!). PostgreSQL-i sakitləşdirmək üçün, gəlin age sütununun tipini INTEGER-dən BIGINT-ə dəyişək:
ALTER TABLE students
ALTER COLUMN age TYPE BIGINT;
Nümunə 2: Sətir uzunluğunu artırmaq
Kursları saxlamaq üçün cədvəl yaratmısan və adların maksimum 50 simvol olacağını düşünmüsən:
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
name VARCHAR(50)
);
Amma birdən məlum olur ki, kurs adları gözlədiyindən daha mürəkkəb və uzundur. Problem asan həll olunur:
ALTER TABLE courses
ALTER COLUMN name TYPE VARCHAR(150);
Nümunə 3: Type çevirmə
Deyək ki, cədvəldə birth_date sahəsi mətn kimi saxlanılırdı:
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
birth_date TEXT
);
Başa düşürsən ki, tarixlərlə TEXT formatında işləmək effektiv deyil, çünki filtrasiya və ya sort etmək olmur. Həll? TEXT-i DATE-ə çeviririk:
ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE USING birth_date::DATE;
USING birth_date::DATE hissəsinə fikir ver. Bu, PostgreSQL-ə deyir ki, data type dəyişməzdən əvvəl datanı çevirmək lazımdır.
Niyə bəzən açıq data çevirmə lazımdır?
PostgreSQL data type dəyişəndə, mövcud datanı avtomatik yeni type-a çevirməyə çalışır. Əgər bu mümkün deyilsə, error verir. Məsələn, TEXT-dən INTEGER-ə keçəndə, mətn datanın necə interpretasiya olunacağını göstərməsən, uğursuzluq olacaq.
Problem nümunəsi
ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE;
-- Xəta: 'not a date' dəyərini DATE tipinə çevirmək mümkün deyil.
Bu problemin həlli var. USING ilə açıq data çevirmə əlavə et:
ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE USING to_date(birth_date, 'YYYY-MM-DD');
Burda to_date() funksiyasından istifadə edirik ki, sətirləri tarix formatına çevirək.
USING komandası
PostgreSQL-də, ALTER TABLE ... ALTER COLUMN ... TYPE ilə sütunun tipini dəyişəndə, bəzən mövcud datanın necə çevriləcəyini göstərmək lazımdır — və burada USING açar sözü işə yarayır.
Sintaksis:
ALTER TABLE table_name
ALTER COLUMN column_name TYPE new_data_type
USING expression;
İzah:
USINGköhnə type-dan yeni type-a dəyərlərin çevrilmə formulunu açıq göstərməyə imkan verir.- Bu, xüsusilə avtomatik çevirmə mümkün və ya birmənalı olmadıqda faydalıdır.
Sadə nümunə: sətir → rəqəm
ALTER TABLE users
ALTER COLUMN age TYPE INTEGER
USING age::INTEGER;
Burda age əvvəl TEXT idi, indi isə onu INTEGER-ə çevirmək istəyirik. USING age::INTEGER — açıq type çevirmədir.
Nümunə: mətn → tarix
ALTER TABLE events
ALTER COLUMN event_date TYPE DATE
USING TO_DATE(event_date, 'YYYY-MM-DD');
Əgər event_date '2023-10-25' kimi mətn idisə, PostgreSQL-ə onu DATE tipinə necə çevirmək lazım olduğunu deyirik.
USING nə vaxt mütləq lazımdır?
- Birbaşa type çevirmə yoxdursa.
- Data transformasiya olunmalıdırsa.
- Type-lar uyğun gəlmir (
TEXT→BOOLEAN,VARCHAR→INTEGERvə s.).
Data type dəyişəndə tipik səhvlər
Data çevirmə olmadan xəta. Əgər data avtomatik yeni type-a çevrilə bilmirsə, mütləq USING ilə çevirməni göstər.
ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE;
-- Xəta: 'birth_date' sütununda DATE üçün uyğun olmayan dəyərlər var
Əməliyyat cədvəli bloklayır. Yadda saxla ki, data type dəyişəndə cədvəl yazmaq üçün bloklana bilər, əməliyyat bitənə qədər. Bu, xüsusilə böyük cədvəllərdə vacibdir. Dəyişiklikləri aşağı aktivlik vaxtına planlaşdır.
Əlaqəli cədvəllər və xarici açarlarla problemlər. Əgər sütun xarici açarın bir hissəsidirsə, onun tipini dəyişmək çətin ola bilər. PostgreSQL xarici açarları yenidən yaratmağı tələb edəcək.
Faydalı məsləhətlər
Həmişə mövcud datanı yoxla. SELECT DISTINCT column_name kimi sorğulardan istifadə et, type dəyişməzdən əvvəl datanın problemsiz çevrilib-çevrilməyəcəyini başa düşmək üçün.
Dəyişiklikləri test et. Əsas cədvəli dəyişməzdən əvvəl müvəqqəti kopyasını yarat və orda sına. Məsələn:
CREATE TEMP TABLE temp_students AS SELECT * FROM students;
USING-i unutma. Data type radikal dəyişəndə (TEXT → NUMERIC kimi) bu sənin xilaskarındır.
Artıq PostgreSQL-də sütunun data type-ını necə dəyişmək lazım olduğunu bilirsən. Ümid edirəm, növbəti dəfə data strukturunu dəyişmək lazım olanda, özünə əmin olacaqsan. Cədvəllər ağıllıdır, amma bəzən onların da upgrade-ə ehtiyacı olur!
GO TO FULL VERSION