আগের পর্বে আমরা শিখেছি কিভাবে ATTACH DATABASE কমান্ডের মাধ্যমে একই SQLite সেশনে একাধিক ডাটাবেস ফাইল যুক্ত করতে হয়। আজ আমরা শিখব কিভাবে সেই সংযুক্ত ডাটাবেসকে বিচ্ছিন্ন (detach) করতে হয়। DETACH DATABASE কমান্ড ব্যবহার করে আমরা নির্দিষ্ট অ্যালিয়াসধারী একটি ডাটাবেসকে সেশন থেকে সরিয়ে ফেলতে পারি। এটি জেনে রাখা গুরুত্বপূর্ণ, কারণ—
- কাজ শেষে অপ্রয়োজনীয় ডাটাবেস সংযোগ সরিয়ে ফেলা ভালো প্র্যাকটিস।
- একই ফাইলের একাধিক অ্যালিয়াস থাকলে শুধু একটি অ্যালিয়াস সরিয়ে বাকিগুলো রেখে দেওয়া যায়।
- ইন-মেমরি বা অস্থায়ী (temporary) ডাটাবেস ডিট্যাচ করলে তার ভেতরের সব ডেটা ধ্বংস হয়ে যায়।
চলুন, পুরো বিষয়টি উদাহরণসহ বুঝে নিই।
পূর্বপ্রস্তুতি
- SQLite ইন্সটল থাকতে হবে (না থাকলে সিরিজের ৩য় পর্ব দেখুন)।
- টার্মিনাল বা কমান্ড প্রম্পট খোলা রাখুন।
- কোনো আলাদা প্যাকেজের দরকার নেই।
১. DETACH DATABASE-এর সিনট্যাক্স
sql
DETACH DATABASE 'Alias-Name';
- ‘Alias-Name’: সেই অ্যালিয়াস নাম যা আপনি
ATTACH DATABASEকরার সময় ব্যবহার করেছিলেন। এটি সিঙ্গেল কোটেশনের ভেতরে দিতে হবে।
মনে রাখবেন:
- আপনি
mainঅথবাtempডাটাবেস কখনোই ডিট্যাচ করতে পারবেন না। এগুলো স্থায়ীভাবে SQLite-এর প্রতিটি কানেকশনে থাকে। - ডিট্যাচ করলে ফাইল-ভিত্তিক ডাটাবেসের ক্ষেত্রে ফাইলটি ডিলিট হয় না, শুধু সংযোগটি বিচ্ছিন্ন হয়। কিন্তু ইন-মেমরি বা টেম্পোরারি ডাটাবেস ডিট্যাচ করলে সেটির সব ডেটা ধ্বংস হয়ে যায়।
২. ব্যবহারিক উদাহরণ – ধাপে ধাপে
আমরা আগের পর্বের মতো একটি দৃশ্য তৈরি করি। ধরুন, mydata.db নামে একটি মূল ডাটাবেস আছে, আর archive.db নামে একটি আর্কাইভ ডাটাবেস আছে। আমরা archive.db-কে দুইটি ভিন্ন অ্যালিয়াসে (একই ফাইল) সংযুক্ত করব, তারপর একটি অ্যালিয়াস ডিট্যাচ করব এবং পর্যবেক্ষণ করব।
ধাপ ১: দুটি ডাটাবেস ফাইল তৈরি
টার্মিনালে:
bash
sqlite3 mydata.db "CREATE TABLE students (id INT, name TEXT);" sqlite3 archive.db "CREATE TABLE old_students (id INT, name TEXT);"
এখন mydata.db ও archive.db ফাইল তৈরি হয়েছে। (আমরা সরাসরি এক লাইনে টেবিল তৈরি করেছি।)
ধাপ ২: mydata.db খুলে archive.db-কে দুই অ্যালিয়াসে ATTACH করা
bash
sqlite3 mydata.db
এখন SQLite প্রম্পটে:
sql
ATTACH DATABASE 'archive.db' AS 'arc1'; ATTACH DATABASE 'archive.db' AS 'arc2';
ধাপ ৩: সংযুক্ত ডাটাবেসের তালিকা দেখা
sql
.databases
আউটপুট হবে এমন:
text
seq name file --- --------------- ---------------------- 0 main /path/to/mydata.db 2 arc1 /path/to/archive.db 3 arc2 /path/to/archive.db
(এখানে seq 1 হচ্ছে temp।) দেখুন, একই ফাইল archive.db দুটি ভিন্ন অ্যালিয়াসে যুক্ত আছে।
ধাপ ৪: শুধুমাত্র ‘arc2’ ডিট্যাচ করা
sql
DETACH DATABASE 'arc2';
আবার .databases দিন:
sql
.databases
এবার আউটপুট:
text
seq name file --- --------------- ---------------------- 0 main /path/to/mydata.db 2 arc1 /path/to/archive.db
arc2 অদৃশ্য হয়ে গেছে, কিন্তু arc1 এবং মূল সংযোগ main বহাল আছে। archive.db ফাইলটি ডিস্কে এখনো ঠিক আছে।
ধাপ ৫: এখন যদি আমরা ‘arc1’-ও ডিট্যাচ করি
sql
DETACH DATABASE 'arc1'; .databases -- seq 0 main, seq 1 temp
তবুও archive.db ফাইলটি ডিস্কে থাকবে, কারণ এটি ফাইল-ভিত্তিক। আপনি চাইলে আবার ATTACH করে ব্যবহার করতে পারবেন।
৩. main এবং temp ডাটাবেস ডিট্যাচ করার চেষ্টা (এরর)
SQLite আপনাকে main বা temp ডিট্যাচ করতে দেবে না। চেষ্টা করলে এরর মেসেজ আসবে:
sql
DETACH DATABASE 'main'; -- Error: cannot detach database 'main' DETACH DATABASE 'temp'; -- Error: cannot detach database 'temp'
এই আচরণ ডাটাবেস সংযোগের মৌলিক কাঠামো রক্ষা করে।
৪. ইন-মেমরি/টেম্পোরারি ডাটাবেস ডিট্যাচ করার ফল
যদি কোনো ডাটাবেস ইন-মেমরি হয় (যেমন :memory: বা ফাঁকা "" দিয়ে খোলা) অথবা temp-এর মতো অস্থায়ী প্রকৃতির হয়, তবে ডিট্যাচ করার সাথে সাথেই তার সকল ডেটা মুছে যায়।
উদাহরণ:
sql
ATTACH DATABASE ':memory:' AS memdb;
CREATE TABLE memdb.test (val TEXT);
INSERT INTO memdb.test VALUES ('hello');
SELECT * FROM memdb.test; -- ফলাফল আসবে
DETACH DATABASE 'memdb';
-- এখন memdb আর অ্যাক্সেস নেই, এবং সমস্ত ডেটা ধ্বংসপ্রাপ্ত।
৫. ডিরেক্টরি স্ট্রাকচার ও ফাইলের অবস্থা
উপরোক্ত উদাহরণের পর, আপনার প্রজেক্ট ফোল্ডারে নিম্নলিখিত ফাইলগুলো থাকবে:
text
project-folder/ ├── mydata.db └── archive.db
DETACH করার ফলে এই ফাইলগুলোর কোনো পরিবর্তন হয় না – ফাইল অক্ষত থাকে। শুধু SQLite সেশন থেকে সংযোগটি সরিয়ে নেওয়া হয়।
প্যাকেজ/বিশেষ নির্দেশনা: শুধুমাত্র SQLite কমান্ড-লাইন টুলই যথেষ্ট। প্রোগ্রামিং ল্যাঙ্গুয়েজ থেকে একই
DETACH DATABASESQL স্টেটমেন্ট এক্সিকিউট করলেই হবে।
৬. গুরুত্বপূর্ণ টিপস ও সতর্কতা
- একই ফাইলের একাধিক অ্যালিয়াস: যদি আপনি ভুলবশত একই ফাইলকে ভিন্ন অ্যালিয়াসে একাধিকবার ATTACH করেন, তবে DETACH শুধুমাত্র একটি অ্যালিয়াস সরাবে। অন্য অ্যালিয়াস দিয়ে তখনও ওই ফাইল অ্যাক্সেস করা যাবে। সুতরাং সতর্ক থাকুন, অপ্রয়োজনীয় অ্যালিয়াস পরিষ্কার করে ফেলুন।
- ফাইল ডিলিট হয় না:
DETACHফাইল ডিলিট করে না। যদি ফাইল ডিলিট করতে চান, তাহলে DETACH-এর পর অপারেটিং সিস্টেমের ডিলিট কমান্ড ব্যবহার করুন। - ইন-মেমরি ডাটাবেস ধ্বংস: ভুলবশত ইন-মেমরি ডাটাবেস ডিট্যাচ করলে সমস্ত ডেটা হারিয়ে যাবে। প্রয়োজনীয় ডেটা থাকলে আগে
.dumpকরে রাখুন। - DETACH করার পর টেবিল রেফারেন্স: ডিট্যাচ করার পর ওই অ্যালিয়াস দিয়ে পূর্বে রেফারেন্স করা টেবিল আর খুঁজে পাওয়া যাবে না। কোয়েরির আগে নিশ্চিত হয়ে নিন ডাটাবেস সংযুক্ত আছে কিনা।
৭. সম্পূর্ণ চিত্র – ATTACH এবং DETACH এর ব্যবহারিক প্রয়োজনীয়তা
ATTACH ও DETACH একসাথে ব্যবহার করে আপনি একটি সেশনেই দরকারি ডাটাবেস যুক্ত করতে ও সরাতে পারেন। বড় প্রজেক্টে যেখানে বিভিন্ন মডিউলের ডেটা আলাদা ফাইলে থাকে, সেখানে এই টেকনিক কাজে লাগে। যেমন:
sql
-- মাসিক রিপোর্ট তৈরির সময় ATTACH DATABASE 'sales_jan.db' AS jan; ATTACH DATABASE 'sales_feb.db' AS feb; -- দুই মাসের ডেটা মিলিয়ে জটিল অ্যানালিটিক্স কোয়েরি চালান -- ... -- কাজ শেষে বিচ্ছিন্ন করে দিন DETACH DATABASE 'jan'; DETACH DATABASE 'feb';
এতে মূল ডাটাবেস হালকা থাকে এবং ফাইল ম্যানেজমেন্ট সহজ হয়।
পরবর্তী পর্বে
আমরা SQLite-তে CREATE TABLE স্টেটমেন্ট গভীরভাবে শিখব: প্রাইমারি কি, অটোইনক্রিমেন্ট, ফরেন কি, কনস্ট্রেইন্ট (NOT NULL, UNIQUE, CHECK, DEFAULT) – সবই বাস্তব উদাহরণসহ।
লেখকের কথা: এই টিউটোরিয়াল সিরিজে আমরা সর্বশেষ SQLite 3.51.1 সংস্করণ ব্যবহার করছি। বাংলায় প্রযুক্তি শেখার এই যাত্রায় আপনার সমর্থন আমাদের এগিয়ে নিয়ে যায়। ভালো লাগলে শেয়ার করুন, এবং সিরিজের কোনো পর্ব মিস না করতে 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 – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)
