যেকোনো ডাটাবেস টেবিলে প্রাইমারি কি-র মান স্বয়ংক্রিয়ভাবে বাড়ানোর প্রয়োজন প্রায় সবসময়ই থাকে। SQLite-তে এই সুবিধার জন্য রয়েছে AUTOINCREMENT কীওয়ার্ড। এটি শুধুমাত্র INTEGER টাইপের প্রাইমারি কি-র সাথে ব্যবহার করা যায় এবং নিশ্চিত করে যে, প্রতিটি নতুন সারির জন্য একটি ইউনিক পূর্ণসংখ্যা তৈরি হবে। আজকের পর্বে আমরা AUTOINCREMENT-এর ধারণা, সিনট্যাক্স, বাস্তব ব্যবহার, এর পেছনের কাজের কৌশল এবং সাধারণ INTEGER PRIMARY KEY থেকে এর পার্থক্য উদাহরণসহ শিখব।
পূর্বপ্রস্তুতি
- SQLite ইন্সটল থাকতে হবে (সিরিজের ৩য় পর্ব দেখুন)।
- আমরা
autoincrement_demo.dbনামে একটি ডাটাবেস তৈরি করব এবংCOMPANYটেবিল বানাব।
টার্মিনাল:
bash
sqlite3 autoincrement_demo.db
- আউটপুট সুন্দর করতে:
.header on,.mode column।
১. AUTOINCREMENT কী?
AUTOINCREMENT SQLite-র একটি বিশেষ কীওয়ার্ড যা কেবলমাত্র INTEGER PRIMARY KEY কলামের সাথে ব্যবহার করা যায়। এটি নিশ্চিত করে যে:
- প্রতিটি নতুন ইনসার্টে কলামটির মান স্বয়ংক্রিয়ভাবে পূর্ববর্তী সর্বোচ্চ মানের চেয়ে এক বেশি হবে।
- কখনোই পূর্বে ব্যবহৃত কোনো মান পুনরায় ব্যবহার করা হবে না, এমনকি যদি পুরনো সারি ডিলিটও করা হয়। (সাধারণ
INTEGER PRIMARY KEY-তে ডিলিট করলে সেইrowidপরবর্তীতে পুনরায় ব্যবহৃত হতে পারে।) - AUTOINCREMENT ব্যবহৃত হলে ডাটাবেস ফাইলের
sqlite_sequenceনামক একটি সিস্টেম টেবিলে পরবর্তী মান সংরক্ষিত থাকে।
গুরুত্বপূর্ণ: AUTOINCREMENT ব্যবহার করলে INSERT অপারেশন কিছুটা ধীর হয়, কারণ প্রতিবার sqlite_sequence টেবিল আপডেট করতে হয়। তাই যদি আপনার একান্তই নিশ্চয়তা প্রয়োজন হয় যে মান পুনরায় ব্যবহৃত হবে না, তবেই AUTOINCREMENT ব্যবহার করুন।
২. সিনট্যাক্স
AUTOINCREMENT সহ টেবিল তৈরির সিনট্যাক্স:
sql
CREATE TABLE table_name( column1 INTEGER PRIMARY KEY AUTOINCREMENT, column2 datatype, ... );
মনে রাখবেন:
- কলামটি অবশ্যই
INTEGERহতে হবে। PRIMARY KEYকীওয়ার্ড একই কলামে দিতে হবে।AUTOINCREMENTকীওয়ার্ডটিINTEGER PRIMARY KEY-এর পরে বসে।
৩. বাস্তব উদাহরণ: COMPANY টেবিল তৈরি ও ডেটা ইনসার্ট
ধাপ ১: টেবিল তৈরি
sql
CREATE TABLE COMPANY( ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL );
এটি ID কলামকে স্বয়ংক্রিয় বৃদ্ধি করবে। আমরা ইনসার্টের সময় ID দিতে বাধ্য নই।
ধাপ ২: ডেটা ইনসার্ট (ID ছাড়া)
sql
INSERT INTO COMPANY (NAME, AGE, ADDRESS, SALARY) VALUES ('Paul', 32, 'California', 20000.00);
INSERT INTO COMPANY (NAME, AGE, ADDRESS, SALARY) VALUES ('Allen', 25, 'Texas', 15000.00);
INSERT INTO COMPANY (NAME, AGE, ADDRESS, SALARY) VALUES ('Teddy', 23, 'Norway', 20000.00);
INSERT INTO COMPANY (NAME, AGE, ADDRESS, SALARY) VALUES ('Mark', 25, 'Rich-Mond', 65000.00);
INSERT INTO COMPANY (NAME, AGE, ADDRESS, SALARY) VALUES ('David', 27, 'Texas', 85000.00);
INSERT INTO COMPANY (NAME, AGE, ADDRESS, SALARY) VALUES ('Kim', 22, 'South-Hall', 45000.00);
INSERT INTO COMPANY (NAME, AGE, ADDRESS, SALARY) VALUES ('James', 24, 'Houston', 10000.00);
ফলাফল দেখতে:
sql
SELECT * FROM COMPANY;
text
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 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
আমরা ইচ্ছা করলে ID-র মান নিজেও বসাতে পারি। ধরুন, ID=10 দিয়ে ইনসার্ট করি:
sql
INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY) VALUES (10, 'Rahim', 30, 'Dhaka', 50000); SELECT * FROM COMPANY;
এখন ID 10 যুক্ত হবে। পরবর্তীতে ID না দিয়ে ইনসার্ট করলে তা হবে 11 (কারণ সর্বোচ্চ ID ছিল 10, AUTOINCREMENT তা থেকে এক বেশি নেবে)।
৪. AUTOINCREMENT বনাম INTEGER PRIMARY KEY
সাধারণ INTEGER PRIMARY KEY (AUTOINCREMENT ছাড়া) ও AUTOINCREMENT-যুক্ত কলামের মধ্যে কিছু মৌলিক পার্থক্য আছে:
| বৈশিষ্ট্য | INTEGER PRIMARY KEY | AUTOINCREMENT |
|---|---|---|
| মান পুনর্ব্যবহার | ডিলিট করা সারির rowid নতুন ইনসার্টে পুনরায় ব্যবহার হতে পারে। | কখনো পুরনো মান পুনরায় ব্যবহৃত হবে না। |
| গতি | দ্রুত, কারণ sqlite_sequence আপডেট হয় না। | কিছুটা ধীর, কারণ প্রতি ইনসার্টে sqlite_sequence আপডেট হয়। |
sqlite_sequence টেবিল | অনুপস্থিত বা অপ্রয়োজনীয়। | স্বয়ংক্রিয়ভাবে তৈরি হয় এবং সর্বোচ্চ ব্যবহৃত মান জমা থাকে। |
| ডিলিট ও রিসেট | সব ডেটা ডিলিট করলে পরবর্তী ইনসার্ট আবার 1 থেকে শুরু করতে পারে (যদি VACUUM বা টেবিল রিসেট করা হয়)। | সব ডেটা ডিলিট করলেও পূর্বের সর্বোচ্চ মানের চেয়ে এক বেশি থেকে শুরু হবে (যেমন 7-এর পর 8), যদি না sqlite_sequence ম্যানুয়ালি রিসেট করা হয়। |
উদাহরণ:
AUTOINCREMENT ছাড়া টেবিল:
sql
CREATE TABLE test (id INTEGER PRIMARY KEY, val TEXT);
INSERT INTO test (val) VALUES ('A'); -- id=1
DELETE FROM test;
INSERT INTO test (val) VALUES ('B'); -- id=1 পুনরায় হতে পারে (কারণ rowid পুনরায় ব্যবহৃত)
AUTOINCREMENT টেবিল:
sql
CREATE TABLE test2 (id INTEGER PRIMARY KEY AUTOINCREMENT, val TEXT);
INSERT INTO test2 (val) VALUES ('A'); -- id=1
DELETE FROM test2;
INSERT INTO test2 (val) VALUES ('B'); -- id=2 (কারণ AUTOINCREMENT 1 পুনরায় দেয় না)
৫. sqlite_sequence টেবিল
যখন কোনো টেবিলে AUTOINCREMENT ব্যবহার করা হয়, SQLite স্বয়ংক্রিয়ভাবে sqlite_sequence নামে একটি টেবিল তৈরি করে, যেখানে ওই টেবিলের নাম ও এখন পর্যন্ত ব্যবহৃত সর্বোচ্চ rowid জমা থাকে।
sql
SELECT * FROM sqlite_sequence WHERE name = 'COMPANY';
আউটপুট: COMPANY | 10 (যদি আমরা 10 দিয়ে ইনসার্ট করে থাকি)।
আপনি চাইলে এই টেবিল আপডেট করে পরবর্তী AUTOINCREMENT মান নিয়ন্ত্রণ করতে পারেন:
sql
UPDATE sqlite_sequence SET seq = 100 WHERE name = 'COMPANY';
এরপর নতুন ইনসার্টে ID শুরু হবে 101 থেকে। সতর্কতা: এটি উন্নত ব্যবহার, ভুল করলে ডুপ্লিকেট আইডি হয়ে যেতে পারে।
৬. ডিরেক্টরি স্ট্রাকচার ও প্যাকেজ
শুধুমাত্র autoincrement_demo.db ফাইলটি ব্যবহৃত হচ্ছে। কোনো অতিরিক্ত প্যাকেজ লাগবে না।
text
project-folder/ └── autoincrement_demo.db
৭. গুরুত্বপূর্ণ টিপস
- সর্বদা AUTOINCREMENT ব্যবহার করবেন না: যদি আপনার অ্যাপ্লিকেশনে পুরনো আইডি পুনরায় ব্যবহারে কোনো সমস্যা না হয়, তাহলে সাধারণ
INTEGER PRIMARY KEYব্যবহার করাই ভালো – এটি দ্রুত এবং কম ওভারহেড। - AUTOINCREMENT গ্যারান্টি: এটি নিশ্চিত করে যে প্রতিটি সারির আইডি ইউনিক এবং কখনো পুনরায় ব্যবহৃত হবে না – যা অডিট ট্রেইল বা লগিংয়ে গুরুত্বপূর্ণ।
- ইনসার্ট ব্যর্থ হলে: যদি কোনো ইনসার্ট ব্যর্থ হয়, তবুও
AUTOINCREMENTকাউন্টার বাড়তে পারে না – শুধুমাত্র সফল ইনসার্টের পরsqlite_sequenceআপডেট হয়। - আইডি নিজে দেওয়া: আপনি চাইলে ইনসার্টের সময় নির্দিষ্ট আইডি দিতে পারেন; AUTOINCREMENT সেটিকে সম্মান করে এবং পরবর্তী স্বয়ংক্রিয় মান সেই প্রদত্ত মানের চেয়ে বড় হবে।
৮. সম্পূর্ণ অনুশীলন সেশন
sql
.headers on
.mode column
-- AUTOINCREMENT টেবিল তৈরি
CREATE TABLE demo (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT
);
-- ইনসার্ট (id ছাড়া)
INSERT INTO demo (name) VALUES ('First');
INSERT INTO demo (name) VALUES ('Second');
SELECT * FROM demo;
-- একটি ডিলিট
DELETE FROM demo WHERE id = 2;
-- আবার ইনসার্ট, id পুনরায় 2 হবে না, বরং 3 হবে
INSERT INTO demo (name) VALUES ('Third');
SELECT * FROM demo;
-- sqlite_sequence চেক
SELECT * FROM sqlite_sequence WHERE name = 'demo';
-- ম্যানুয়াল আইডি দিয়ে ইনসার্ট
INSERT INTO demo (id, name) VALUES (10, 'Ten');
-- পরবর্তী স্বয়ংক্রিয় মান 11 হবে
INSERT INTO demo (name) VALUES ('After Ten');
SELECT * FROM demo;
পরবর্তী পর্বে
আমরা শিখব SQLite EXPLAIN – কীভাবে কোয়েরি অপ্টিমাইজেশন প্ল্যান দেখা যায় এবং ডিবাগিং করা যায়।
লেখকের কথা: AUTOINCREMENT ছোট একটি ফিচার হলেও এর সঠিক ব্যবহার ডেটা ম্যানেজমেন্টে বড় পার্থক্য আনে। বাংলায় এই সিরিজের প্রতি আপনার আগ্রহই আমাদের এগিয়ে নেয়। পোস্টটি ভালো লাগলে শেয়ার করতে ভুলবেন না, এবং সব আপডেট পেতে 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 – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)
