ডেটাবেইজ যখন ব্যবহার করছেন তখন SQL-এই অফলোড করে দিতে পারেন unique ID generation
postgres/oracle/sql server-এ sequence আছে। sequence ব্যবহার করে auto-incrementing id জেনারেট করা যায়।
যেমন, SQL server-এ MySequence নামে একটা সিকোয়েন্স তৈরী করলামঃ
CREATE SEQUENCE [MySequence]
AS INT
START WITH 0
INCREMENT BY 1
এরপর NEXT VALUE FOR MySequence কল করলেই একটা একটা করে নতুন সিকোয়েনশিয়াল নাম্বার (1,2,3...) জেনারেট হতে থাকবেঃ
DECLARE @seqCounter INT
SET @seqCounter = NEXT VALUE FOR [MySequence]
আপনার রিকোয়ারমেন্ট অনুযায়ী T-SQL কোডঃ
DECLARE @seqCounter INT
SET @seqCounter = NEXT VALUE FOR [MySequence]
DECLARE @currentDate DATE
SET @currentDate = CAST(GETDATE() AS DATE)
DECLARE @uniqueId VARCHAR(20)
SET @uniqueId = FORMAT(@currentDate, 'dd-MM-yyyy ') + CAST(@seqCounter AS CHAR(4))
SELECT @uniqueId
ওপরের পুরো কোডটা ১ লাইনেই করা যায়, তবে বোঝার সুবিধার জন্য স্টেপ বাই স্টেপ ভেঙ্গে দিলাম।
SET @seqCounter = NEXT VALUE FOR [MySequence]
এখানে MySequence-এর পরবর্তী ভ্যালুটি @seqCounter ভ্যারিয়েবলে নিচ্ছি
SET @currentDate = CAST(GETDATE() AS DATE)
আজকের তারিখটি @currentDate-এ রাখছি। GETDATE() ফাংশন পুরো ডেট+টাইম রিটার্ণ করে, তাই CAST() ফাংশন ব্যবহার করে শুধু তারিখ পার্টটি নিচ্ছি।
SET @uniqueId = FORMAT(@currentDate, 'dd-MM-yyyy-') + CAST(@seqCounter AS CHAR(4))
@currentDate-এর তারিখটিকে 'dd-MM-yyyy-' প্যাটার্ণে ফরম্যাট করছি। এছাড়া @seqCounter-কে স্টৃং-এ পরিণত করছি।
পিএসঃ আপনার রিকোয়ারমেণ্টে দেখলাম ৪ ডিজিট নাম্বারটি left zero-padded। SQL server-এ প্যাডিং করার জন্য কোনো বিল্ট-ইন ফাংশন নাই। একটু ঘুরপথে করতে হবেঃ
SET @padstr = REPLICATE('0', 4)
SET @seqString = RIGHT(@padstr + CAST( @seqCounter AS VARCHAR(4)), 4)
ওপরের কোডটি আপনার ব্যবহৃত ডেটাবেইজের জন্য মডিফাই করে নিতে পারবেন গুগলের সাহায্যে। আর SQL নিয়ে বেশি ঝামেলা করতে না চাইলে PHP-তে অফলোড করে নিতে পারেন। সেক্ষেত্রে শুধুমাত্র ডেটাবেইজ থেকে শুধুমাত্র "SELECT NEXT VALUE FOR [MySequence]" কুয়েরী করে অয়ন ভাইয়ের কোডটি ব্যবহার করুন।
পিএস: 28-06-2014-0001 এর চাইতে 2014-06-28-0001 ফরম্যাটটি (yyyy-mm-dd...) বরং আরো অপ্টিমাইজড
পিএস #২: কি ডেটাবেইজ ব্যবহার করছেন?
Calm... like a bomb.