ডাটাবেসের চাহিদা সময়ের সাথে পাল্টায়। অনেক সময় টেবিল তৈরি করার পর দেখা যায় তার নাম বদলানো দরকার, কিংবা একটি নতুন কলাম সংযুক্ত করতে হবে। SQLite-তে এই কাজটি করার জন্য ALTER TABLE কমান্ড ব্যবহৃত হয়। তবে গুরুত্বপূর্ণ বিষয় হলো, SQLite-র ALTER TABLE শুধুমাত্র দুটি কাজ সমর্থন করে: টেবিলের নাম পরিবর্তন (RENAME TO) এবং নতুন কলাম যোগ করা (ADD COLUMN)। কলাম মুছে ফেলা, কলামের ডেটা টাইপ পরিবর্তন, বা কনস্ট্রেইন্ট যোগ/মুছার কোনো সরাসরি সুবিধা নেই। এই পর্বে আমরা ALTER TABLE-এর সম্পূর্ণ ব্যবহার, সীমাবদ্ধতা ও বিকল্প উপায় উদাহরণসহ শিখব।
পূর্বপ্রস্তুতি
- SQLite ইন্সটল থাকতে হবে (সিরিজের ৩য় পর্ব দেখুন)।
COMPANYটেবিল ব্যবহার করব।alter_demo.dbনামে ডাটাবেস তৈরি করি।
টার্মিনাল:
bash
sqlite3 alter_demo.db
sql
CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL ); INSERT INTO COMPANY VALUES (1, 'Paul', 32, 'California', 20000.00); INSERT INTO COMPANY VALUES (2, 'Allen', 25, 'Texas', 15000.00); INSERT INTO COMPANY VALUES (3, 'Teddy', 23, 'Norway', 20000.00); INSERT INTO COMPANY VALUES (4, 'Mark', 25, 'Rich-Mond', 65000.00); INSERT INTO COMPANY VALUES (5, 'David', 27, 'Texas', 85000.00); INSERT INTO COMPANY VALUES (6, 'Kim', 22, 'South-Hall', 45000.00); INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00);
- আউটপুট ফরম্যাট:
.header onও.mode column।
১. ALTER TABLE-এর সাধারণ সিনট্যাক্স
SQLite-তে ALTER TABLE-এর দুটি রূপ:
টেবিলের নাম পরিবর্তন:
sql
ALTER TABLE database_name.table_name RENAME TO new_table_name;
নতুন কলাম যোগ করা:
sql
ALTER TABLE database_name.table_name ADD COLUMN column_def...;
database_name. ঐচ্ছিক। মূল ডাটাবেসের জন্য না দিলেও চলে। column_def-এ কলামের নাম, ডেটা টাইপ ও প্রয়োজনীয় কনস্ট্রেইন্ট (যেমন DEFAULT, NOT NULL ইত্যাদি) দেওয়া যায়। তবে কিছু সীমাবদ্ধতা আছে: নতুন কলামে NOT NULL দিতে গেলে অবশ্যই DEFAULT মান উল্লেখ করতে হবে, নয়তো এরর আসবে, কারণ বিদ্যমান সারিগুলোর জন্য NULL মান বসবে। আর UNIQUE বা PRIMARY KEY কনস্ট্রেইন্ট ADD COLUMN-এর সাথে দেওয়া যায় না।
২. টেবিলের নাম পরিবর্তন (RENAME TO)
COMPANY টেবিলের নাম বদলে OLD_COMPANY রাখি:
sql
ALTER TABLE COMPANY RENAME TO OLD_COMPANY;
এখন .tables কমান্ড দিয়ে দেখি:
sql
.tables -- আউটপুট: OLD_COMPANY
SELECT * FROM OLD_COMPANY; চালালে আগের সব ডেটা অক্ষত আছে। টেবিলের নাম পরিবর্তন করলে ডেটার কোনো ক্ষতি হয় না, এবং টেবিলের সাথে সম্পর্কিত ইনডেক্স ও ট্রিগারও স্বয়ংক্রিয়ভাবে নতুন নামের সাথে আপডেট হয়ে যায়।
৩. নতুন কলাম যোগ করা (ADD COLUMN)
OLD_COMPANY টেবিলে SEX নামে একটি কলাম যোগ করি, যেখানে লিঙ্গ সংরক্ষণ করা হবে (এক অক্ষর)।
sql
ALTER TABLE OLD_COMPANY ADD COLUMN SEX char(1);
এখন SELECT * FROM OLD_COMPANY; দিলে আউটপুট:
text
ID NAME AGE ADDRESS SALARY SEX ---------- ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0
লক্ষ্য করুন, SEX কলামের সব সারিতে NULL বসেছে। এটি ডিফল্ট আচরণ। আপনি চাইলে ডিফল্ট মান দিতে পারেন:
sql
ALTER TABLE OLD_COMPANY ADD COLUMN STATUS TEXT DEFAULT 'Active';
তাহলে বিদ্যমান সব সারির জন্য STATUS-এ ‘Active’ বসবে। আবার NOT NULL চাইলে অবশ্যই DEFAULT দিতে হবে:
sql
ALTER TABLE OLD_COMPANY ADD COLUMN COUNTRY TEXT NOT NULL DEFAULT 'USA';
৪. SQLite-তে ALTER TABLE-এর সীমাবদ্ধতা
SQLite-র ALTER TABLE কেবল উপরের দুটি অপারেশন সমর্থন করে। আপনি পারবেন না:
- কোনো কলাম মুছে ফেলতে (DROP COLUMN)।
- কলামের নাম বা ডেটা টাইপ পরিবর্তন করতে (ALTER COLUMN)।
- নতুন কনস্ট্রেইন্ট (UNIQUE, CHECK, FOREIGN KEY) যোগ বা মুছতে।
তাহলে কী করবেন? যদি জটিল পরিবর্তন দরকার হয়, তাহলে এই ধাপ অনুসরণ করুন:
- কাঙ্খিত গঠনসহ একটি নতুন টেবিল তৈরি করুন।
- পুরনো টেবিল থেকে ডেটা কপি করে নতুন টেবিলে ইনসার্ট করুন (
INSERT INTO new_table SELECT ... FROM old_table)। - পুরনো টেবিল ড্রপ করুন (
DROP TABLE old_table)। - নতুন টেবিলের নাম পরিবর্তন করে পুরনো নাম দিন (
ALTER TABLE new_table RENAME TO old_table)।
উদাহরণ: ধরুন, আমরা SEX কলামটি বাদ দিতে চাই। নতুন টেবিল COMPANY_NEW:
sql
CREATE TABLE COMPANY_NEW ( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL ); INSERT INTO COMPANY_NEW (ID, NAME, AGE, ADDRESS, SALARY) SELECT ID, NAME, AGE, ADDRESS, SALARY FROM OLD_COMPANY; DROP TABLE OLD_COMPANY; ALTER TABLE COMPANY_NEW RENAME TO COMPANY;
এখন COMPANY টেবিলে SEX কলাম নেই।
৫. ডিরেক্টরি স্ট্রাকচার ও প্যাকেজ
শুধুমাত্র alter_demo.db ফাইলটি ব্যবহৃত হচ্ছে। কোনো অতিরিক্ত প্যাকেজ ইন্সটল করতে হবে না।
text
project-folder/ └── alter_demo.db
৬. গুরুত্বপূর্ণ টিপস
- RENAME-এর সময় সতর্কতা: টেবিলের নাম বদলালে সেই টেবিলের উপর নির্ভরশীল ভিউ বা ট্রিগার আপডেট হয়, কিন্তু প্রোগ্রাম কোডে হার্ডকোডেড নাম থাকলে ম্যানুয়ালি পরিবর্তন করতে হবে।
- ADD COLUMN-এ DEFAULT: বিদ্যমান ডেটার জন্য নতুন কলামে ডিফল্ট মান দেওয়া সবসময় ভালো প্র্যাকটিস, যাতে অপ্রত্যাশিত NULL এড়ানো যায়।
- ADD COLUMN-এ UNIQUE নয়: নতুন কলামে সরাসরি UNIQUE বা PRIMARY KEY দেওয়া যাবে না। প্রয়োজনে আলাদা করে UNIQUE INDEX তৈরি করতে পারেন পরে।
- কলামের অবস্থান: SQLite-তে নতুন কলাম সবসময় টেবিলের শেষে যোগ হয়। কলামের ক্রম পরিবর্তনের কোনো উপায় নেই (সেটা চাইলে নতুন টেবিল তৈরি পদ্ধতি ব্যবহার করতে হবে)।
৭. সম্পূর্ণ অনুশীলন সেশন
টার্মিনালে নিচের কমান্ডগুলো চালান:
sql
.headers on .mode column -- বর্তমান টেবিল দেখি .tables SELECT * FROM COMPANY; -- ১. টেবিল রিনেম ALTER TABLE COMPANY RENAME TO STAFF; .tables -- ২. নতুন কলাম যোগ ALTER TABLE STAFF ADD COLUMN EMAIL TEXT; SELECT * FROM STAFF; -- ৩. ডিফল্ট সহ নতুন কলাম ALTER TABLE STAFF ADD COLUMN ACTIVE INTEGER DEFAULT 1; SELECT * FROM STAFF; -- পুনরায় আগের নামে ফেরত ALTER TABLE STAFF RENAME TO COMPANY;
পরবর্তী পর্বে
আমরা শিখব SQLite Views – কিভাবে এক বা একাধিক টেবিলের উপর ভিত্তি করে ভার্চুয়াল টেবিল তৈরি করতে হয় এবং এর ব্যবহারিক প্রয়োগ।
লেখকের কথা: ALTER TABLE ছোট পরিসরে কাজ করলেও টেবিল রক্ষণাবেক্ষণে খুবই দরকারি। বাংলায় প্রযুক্তি শেখার এই ধারা অব্যাহত রাখতে আপনার শেয়ার ও উৎসাহ আমাদের বড় প্রেরণা। পোস্টটি ভালো লাগলে বন্ধুদের জানাতে ভুলবেন না! সম্পূর্ণ সিরিজের আপডেট পেতে ToLearnTeam.com সাবস্ক্রাইব করুন। কোনো প্রশ্ন বা জিজ্ঞাসা থাকলে কমেন্টে জানান – আমরা উত্তর দিতে প্রস্তুত!
SQLite Full Course
- SQLite পরিচিতি ও ইন্সটলেশন গাইড – বাংলায় প্রথম ডাটাবেস তৈরি
- SQLite কী এবং কেন শিখবেন? সম্পূর্ণ ওভারভিউ ও কমান্ড ক্লাসিফিকেশন (DDL, DML, DQL)
- SQLite ইন্সটলেশন গাইড – Windows, Linux ও Mac-এ ধাপে ধাপে সেটআপ
- SQLite ডট কমান্ড (Dot Commands) – সম্পূর্ণ গাইড, আউটপুট ফরম্যাট ও sqlite_master
- SQLite সিনট্যাক্স (Syntax) – কেস সেনসিটিভিটি, কমেন্ট, সব কমান্ডের গঠন ও উদাহরণ
- SQLite ডেটা টাইপ (Data Type) – স্টোরেজ ক্লাস, টাইপ অ্যাফিনিটি, বুলিয়ান ও ডেট-টাইম
- SQLite ডেটাবেস তৈরি (Create Database) – ধাপে ধাপে গাইড, .dump এক্সপোর্ট ও রিস্টোর
- SQLite ATTACH DATABASE – একাধিক ডাটাবেস সংযুক্ত করার সম্পূর্ণ গাইড (বাংলা)
- SQLite DETACH DATABASE – সংযুক্ত ডাটাবেস বিচ্ছিন্ন করার পূর্ণাঙ্গ গাইড
- SQLite CREATE TABLE স্টেটমেন্ট – টেবিল তৈরি করার পূর্ণাঙ্গ গাইড (বাংলা)
- SQLite DROP TABLE স্টেটমেন্ট – টেবিল ডিলিট করার সম্পূর্ণ গাইড (বাংলা)
- SQLite INSERT INTO স্টেটমেন্ট – ডেটা ইনসার্ট করার সম্পূর্ণ গাইড (বাংলা)
- SQLite SELECT স্টেটমেন্ট – টেবিল থেকে ডেটা ফেচ করার সম্পূর্ণ গাইড (বাংলা)
- SQLite অপারেটর (Operators) – Arithmetic, Comparison, Logical, Bitwise (বাংলা টিউটোরিয়াল)
- SQLite এক্সপ্রেশন (Expressions) – বুলিয়ান, নিউমেরিক ও ডেট এক্সপ্রেশন (বাংলা টিউটোরিয়াল)
- SQLite AND ও OR অপারেটর – একাধিক শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
- SQLite UPDATE Query – টেবিলের ডেটা পরিবর্তন করার সম্পূর্ণ গাইড (বাংলা)
- SQLite DELETE Query – টেবিল থেকে ডেটা মুছে ফেলার সম্পূর্ণ গাইড (বাংলা)
- SQLite LIKE Operator – প্যাটার্ন মিলিয়ে ডেটা খোঁজার সম্পূর্ণ গাইড (বাংলা)
- SQLite GLOB Operator – কেস-সেনসিটিভ প্যাটার্ন মিলিয়ে ডেটা খোঁজা (বাংলা)
- SQLite LIMIT Clause – ডেটা সীমিত করে আনার সম্পূর্ণ গাইড (বাংলা)
- SQLite ORDER BY ক্লজ – ডেটা সাজানোর সম্পূর্ণ গাইড (বাংলা)
- SQLite GROUP BY ক্লজ – ডেটা গ্রুপ করে বিশ্লেষণ করার সম্পূর্ণ গাইড (বাংলা)
- SQLite HAVING ক্লজ – গ্রুপের উপর শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
- SQLite DISTINCT Keyword – ডুপ্লিকেট ডেটা বাদ দিয়ে ইউনিক ভ্যালু পাওয়া (বাংলা)
- SQLite PRAGMA কমান্ড – ডাটাবেস কনফিগারেশন ও সেটিংস (বাংলা টিউটোরিয়াল)
- SQLite Constraints – NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY, CHECK (বাংলা টিউটোরিয়াল)
- SQLite JOINS – CROSS JOIN, INNER JOIN, LEFT OUTER JOIN (বাংলা টিউটোরিয়াল)
- SQLite UNION ও UNION ALL – একাধিক SELECT একত্রিত করার সম্পূর্ণ গাইড (বাংলা)
- SQLite NULL Values – NULL কী, IS NULL, IS NOT NULL (বাংলা টিউটোরিয়াল)
- SQLite ALIAS Syntax – টেবিল ও কলামের অস্থায়ী নাম (বাংলা টিউটোরিয়াল)
- SQLite Triggers – স্বয়ংক্রিয় ট্রিগার তৈরি, ব্যবহার ও মুছে ফেলা (বাংলা টিউটোরিয়াল)
- SQLite Indexes – CREATE, UNIQUE, COMPOSITE, DROP INDEX (বাংলা টিউটোরিয়াল)
- SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)
- SQLite ALTER TABLE Command – টেবিলের গঠন পরিবর্তন (বাংলা টিউটোরিয়াল)
- SQLite TRUNCATE TABLE Command – DELETE ও DROP দিয়ে টেবিল খালি করা (বাংলা)
- SQLite Views – ভার্চুয়াল টেবিল তৈরি, ব্যবহার ও ডিলিট (বাংলা টিউটোরিয়াল)
- SQLite Transactions – BEGIN, COMMIT, ROLLBACK ও ACID প্রপার্টি (বাংলা)
- SQLite Subqueries – SELECT, INSERT, UPDATE, DELETE-এ সাবকোয়েরি ব্যবহার (বাংলা টিউটোরিয়াল)
- SQLite AUTOINCREMENT – স্বয়ংক্রিয়ভাবে প্রাইমারি কি মান বৃদ্ধি (বাংলা টিউটোরিয়াল)
- SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল)
- SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল)
- SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল)
- SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল)
- SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল)
- SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)
- SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল)
- SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা)
- SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল)
- SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)
