SQL ALTER TABLE Command, examples सकट
Table कधीच "पूर्ण" होत नाहीत. Launch नंतर महिन्याभरात कोणीतरी phone number मागतो, city column ला चांगलं नाव हवं असतं, आणि एकाच नावाचे दोन users वेगळे ओळखताच येत नाहीत हे लक्षात येतं. या chapter मध्ये आपण data असलेला table ALTER TABLE ने बदलू, NOT NULL, DEFAULT आणि UNIQUE सारखे नियम लावू, primary key आणि AUTO_INCREMENT ने प्रत्येक row ला सुरक्षित ओळख देऊ, आणि data काढायचे तीन मार्ग शिकू: DELETE, TRUNCATE आणि DROP.
या class मध्ये काय शिकणार
UPDATE(data बदलतो) विरुद्धALTER TABLE(structure बदलतो)- Safe update mode:
SELECT @@SQL_SAFE_UPDATES,SET SQL_SAFE_UPDATES = 1 / 0, आणिERROR 1175 ALTER TABLE ... ADD COLUMN,MODIFY COLUMN,DROP COLUMN,RENAME COLUMNआणिRENAME TO- Phone number
VARCHARका, काही type बदल fail का होतात, आणिINTची खरी मर्यादा NOT NULL(ERROR 1364),DEFAULT, आणि column परत लिहून नियम काढणं- Primary key विरुद्ध unique key: duplicates,
NULL, आणि एका table मध्ये किती AUTO_INCREMENT: स्वतः id देणं,ERROR 1062, आणि ids मध्ये gaps का येतात- आधीपासून असलेल्या column ला
UNIQUEलावणं DELETEविरुद्धTRUNCATEविरुद्धDROP, table साठी आणि database साठी
1. Practice data
का: खालच्या प्रत्येक command चा result दिलेला आहे. तुम्ही याच पाच rows टाकल्या, तर तुम्हाला तीच उत्तरं मिळतील आणि स्वतः तपासता येईल.
कसं:
mysql -u root -pने login करा.-
नवीन
instagramdatabase ने सुरुवात करा. पहिल्या SQL chapter मधला असेल, तर हे तो काढून टाकतं:DROP DATABASE IF EXISTS instagram; CREATE DATABASE instagram; USE instagram; -
अजून कोणताही नियम नसलेला
userstable बनवा:CREATE TABLE users (id INT, name VARCHAR(50), city VARCHAR(50), age INT); -
पाच rows टाका. Row 3 मुद्दाम दोनदा टाकली आहे:
INSERT INTO users VALUES (1, 'amit', 'pune', 25), (2, 'neha', 'mumbai', 30), (3, 'rahul', 'nashik', 28), (3, 'rahul', 'nashik', 28), (4, 'sneha', NULL, NULL); -
SELECT * FROM users;पाच rows दाखवतो.
पुढे लागणाऱ्या दोन गोष्टी लक्षात ठेवा: दोन rows अगदी सारख्या आहेत (3, rahul, nashik, 28), आणि sneha ची city आणि age दोन्ही नाहीत.
या chapter मधले screenshots जास्त rows असलेल्या table वर घेतले आहेत, म्हणून त्यांचे row counts तुमच्यापेक्षा वेगळे दिसतील. Commands आणि messages तेच आहेत.
2. UPDATE विरुद्ध ALTER TABLE
का: दोन्ही शब्दांचा अर्थ "बदल" असाच वाटतो, आणि interviewers ना हा फरक विचारायला आवडतो.
काय:
UPDATEdata बदलतो: rows मधल्या values. Columns तसेच राहतात.ALTER TABLEstructure बदलतो: कोणते columns आहेत, त्यांचे types, नावं आणि नियम. Rows तशाच राहतात.
Classroom line
To change the table itself, the query is ALTER TABLE.
Class मधलं वाक्य
Table मध्येच बदल करायचा असेल, तर query ALTER TABLE.
Classroom line – हिंदी
"Table me modification karna hai, to query aayega ALTER TABLE."
कसं: ही दोन उदाहरणं फक्त वाचा; खऱ्या commands section 3 पासून चालवू.
UPDATE users SET age = 26 WHERE id = 1;एका row मधली एक value बदलेल.ALTER TABLE users ADD COLUMN phone VARCHAR(15);एकदम प्रत्येक row ला column जोडेल.- सोपी कसोटी: प्रश्न values बद्दल असेल तर
UPDATE; columns बद्दल असेल तरALTER TABLE.
3. Safe update mode
का: WHERE शिवाय UPDATE किंवा DELETE प्रत्येक row बदलतो किंवा delete करतो. एक विसरलेली line पूर्ण column पुसू शकते. Safe update mode त्या चुकीविरुद्ध seat belt आहे.
काय: Safe update mode on असताना MariaDB UPDATE किंवा DELETE नाकारतो, जोपर्यंत त्याचा WHERE key column (उदा. primary key) वापरत नाही, किंवा statement मध्ये LIMIT नाही. या setting चं नाव SQL_SAFE_UPDATES आहे आणि ती तुमच्या session पुरती असते: नवीन login परत server च्या default ने सुरू होतो.
Classroom line
Even if we forget the WHERE condition by mistake, that query won't run.
Class मधलं वाक्य
चुकून जरी आपण WHERE condition लिहिली नाही, तरी ती query चालणार नाही.
Classroom line – हिंदी
"Galti se bhi agar humne WHERE condition nahi likha to wo query fire nahi hoga."
कसं:
- सध्याची value बघा:
SELECT @@SQL_SAFE_UPDATES;नवीन login वर ती0दाखवते, म्हणजे off. - या session साठी on करा:
SET SQL_SAFE_UPDATES = 1; -
WHEREनसलेला update करून बघा:UPDATE users SET city = 'pune'; -
MariaDB नाकारतो:
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column - साध्या column वरचा
WHEREपण नाकारला जातो, कारणcitykey column नाही.DELETE FROM users WHERE city = 'nashik';सुद्धा तोचERROR 1175देतो. LIMITचालतो, कारण तो नुकसान मर्यादित ठेवतो:UPDATE users SET city = 'delhi' WHERE name = 'sneha' LIMIT 1;Query OK, 1 row affectedअसं उत्तर देतो.idprimary key झाल्यावर (section 12),WHERE id = 2पण चालतो.- परत off करा:
SET SQL_SAFE_UPDATES = 0;हा पूर्ण chapter तो off ठेवूनच चालतो. SELECT,INSERTआणिALTER TABLEया setting ने कधीच अडत नाहीत.
Classroom line
Remember this; it is asked in interviews.
Class मधलं वाक्य
"He lakshat theva, interview madhe vichartat."
हे लक्षात ठेवा, interview मध्ये विचारतात.
Classroom line
Remember this; it is asked in interviews.

Whiteboard: Safe update mode key column न वापरणाऱ्या WHERE चा UPDATE नाकारतो (ERROR 1175). पुढची command name NOT NULL करते, आणि DESC name साठी Null = NO दाखवतो.
Figure 1. Safe update mode: WHERE नसेल, किंवा non-key column वर WHERE असेल, तर ERROR 1175; LIMIT किंवा primary key वरचा WHERE चालतो. ही setting फक्त तुमच्या session पुरती.
4. ADD COLUMN: प्रत्येक row साठी नवीन column
का: App ला आता प्रत्येक user चा phone number हवा आहे. तुम्ही नवीन table बनवत नाही; असलेल्या table ला column जोडता.
काय: ALTER TABLE ... ADD COLUMN शेवटी column जोडतो. असलेल्या प्रत्येक row मध्ये त्यात NULL येतो, कारण अजून कोणीच value दिलेली नाही. COLUMN हा शब्द optional आहे: ADD phone INT पण चालतं.
कसं:
-
Column जोडा:
ALTER TABLE users ADD COLUMN phone INT; -
MariaDB
Query OK, 0 rows affectedअसं उत्तर देतो. एकही row वाढली किंवा कमी झाली नाही. DESC users;आताint(11)type सहphoneदाखवतो.SELECT * FROM users;पाचही rows मध्येphoneमध्येNULLदाखवतो.- Value नेहमीसारखी
UPDATEने भरा:UPDATE users SET phone = ... WHERE id = 1;

Whiteboard: ALTER TABLE users ADD COLUMN phone INT, आणि DESC शेवटी नवीन phone column दाखवतो.
5. MODIFY COLUMN: type किंवा size बदला
का: INT phone column ही चूक आहे, हे खरा number टाकताक्षणी कळतं.
काय: MODIFY COLUMN column ला नवा type, size किंवा नियम देतो. तुम्ही पूर्ण column definition परत लिहिता. MariaDB प्रत्येक असलेली value convert करतो; प्रत्येक value नव्या type मध्ये बसली तरच बदल होतो.
कसं:
-
INTcolumn मध्ये खरा mobile number टाकून बघा:UPDATE users SET phone = 9876543210 WHERE id = 1; -
Fail होतो:
ERROR 1264 (22003): Out of range value for column 'phone' at row 1. सगळ्यात मोठाINT2,147,483,647 आहे, आणि 9876543210 सारखा 10 अंकी mobile number त्यापेक्षा मोठा आहे. int(11)मधलं11फक्त display width आहे. त्याचा अर्थ "11 digits" नाही, आणि त्याने मर्यादा बदलत नाही.- Number column ची दुसरी अडचण: तो फक्त value ठेवतो. पुढचा
+आणि सुरुवातीचा0(020...सारख्या landline numbers मधला) जातो. -
म्हणजे phone number हा text आहे. Type बदला:
ALTER TABLE users MODIFY COLUMN phone VARCHAR(15); -
DESC users;आताphone varchar(15)दाखवतो. -
आता plus चिन्हासह पूर्ण number बसतो:
UPDATE users SET phone = '+919876543210' WHERE id = 1; UPDATE users SET phone = '02025501234' WHERE id = 2; -
Column मोठा करणं नेहमी सुरक्षित:
ALTER TABLE users MODIFY COLUMN phone VARCHAR(20);चालतो. - लहान करताना value बसली नाही तर fail:
MODIFY COLUMN phone VARCHAR(10)ERROR 1265 (01000): Data truncated for column 'phone' at row 1देतो, कारण+919876543210मध्ये 13 characters आहेत. VARCHARवरून परतINTकरणं पण fail होतं:MODIFY COLUMN phone INTERROR 1264 ... Out of range value for column 'phone'देतो, कारण 919876543210 हाINTच्या मर्यादेपेक्षा मोठा आहे.- लक्षात ठेवायचा नियम: लहानाकडून मोठ्याकडे सुरक्षित; मोठ्याकडून लहानाकडे, किंवा कडक type कडे, तेव्हाच चालतं जेव्हा प्रत्येक असलेली value बसते.

Whiteboard: ALTER TABLE users MODIFY COLUMN phone VARCHAR(15) असलेल्या rows convert करतो, आणि DESC phone varchar(15) दाखवतो.
Figure 2. प्रत्येक असलेली value बसली तरच MODIFY COLUMN चालतो: INT ते VARCHAR आणि VARCHAR(15) ते VARCHAR(20) सुरक्षित; value बसली नाही तर VARCHAR(20) ते VARCHAR(10) किंवा INT fail. Phone number VARCHAR का.
6. NOT NULL: value compulsory करा
का: नाव नसलेला user आपल्या app मध्ये काहीच अर्थाचा नाही. App काहीही पाठवो, database नेच अशी row नाकारावी असं तुम्हाला हवं.
काय: NOT NULL म्हणजे column मध्ये नेहमी value पाहिजे. तो column सोडणारा, किंवा NULL पाठवणारा INSERT नाकारला जातो.
कसं:
-
namecompulsory करा:ALTER TABLE users MODIFY COLUMN name VARCHAR(20) NOT NULL; -
DESC users;nameसाठीNullcolumn मध्येNOदाखवतो. -
नाव नसलेला user टाका:
INSERT INTO users (id, city) VALUES (5, 'goa'); -
Fail होतो:
ERROR 1364 (HY000): Field 'name' doesn't have a default value. - मुद्दाम
NULLपाठवलं तरी fail:INSERT INTO users (id, name, city) VALUES (5, NULL, 'goa');ERROR 1048 (23000): Column 'name' cannot be nullदेतो. - ज्या column मध्ये आधीच
NULLvalues आहेत तोNOT NULLहोऊ शकत नाही.MODIFY COLUMN phone VARCHAR(20) NOT NULLERROR 1265 (01000): Data truncated for column 'phone' at row 3देतो, कारण तीन rows ना phone नाही. MariaDB चा default strict mode गुपचूप काहीतरी भरण्याऐवजी नाकारतो. - आधी त्या rows
UPDATEने ठीक करा, मगNOT NULLलावा.
Classroom line
Remember one thing: if the column already holds NULLs and you try to make it NOT NULL, it won't work.
Class मधलं वाक्य
"Ek gosht lakshat ghya. Column madhe agodar null asel aani tumhi tyala not null karayla gelat, tar nahi honar."
एक गोष्ट लक्षात घ्या. Column मध्ये आधीच null असेल आणि तुम्ही त्याला not null करायला गेलात, तर नाही होणार.
Classroom line
Remember one thing: if the column already holds NULLs and you try to make it NOT NULL, it won't work.
7. DEFAULT: value दिली नाही तर
का: कधी कधी नसलेल्या value ला योग्य उत्तर असतं. नाव न देता sign up करणारा user "unknown" म्हणून दाखवता येतो, anonymous account सारखा.
काय: INSERT ने column सोडला तर MariaDB जी value साठवतो ती DEFAULT. ती NOT NULL सह किंवा शिवाय चालते.
कसं:
-
NOT NULLठेवून default जोडा:ALTER TABLE users MODIFY COLUMN name VARCHAR(20) NOT NULL DEFAULT 'unknown'; -
आधी fail झालेला insert चालवा:
INSERT INTO users (id, city) VALUES (5, 'goa'); -
आता चालतो, आणि row 5 चं नाव
unknownआहे. ageलाNOT NULLशिवाय 18 चा default द्या:ALTER TABLE users MODIFY COLUMN age INT DEFAULT 18;
Classroom line
If someone doesn't insert an age, 18 should go there.
Class मधलं वाक्य
कोणी age insert केली नाही, तर तिथे 18 यायला पाहिजे.
Classroom line – हिंदी
"Agar kisi ne age insert nahi kiya, toh waha pe 18 aana chahiye."
-
Age नसलेला user टाका:
INSERT INTO users (id, name, city) VALUES (6, 'kiran', 'solapur'); -
SELECT * FROM users;6 | kiran | solapur | 18दाखवतो. - Default फक्त column सोडणाऱ्या नवीन rows भरतो. जुन्या rows चा
NULLतसाच राहतो: sneha ची age अजूनNULLच आहे. DESC users;Defaultcolumn मध्येunknownआणि18दाखवतो.

Whiteboard: ALTER TABLE users MODIFY COLUMN age INT DEFAULT 18; DESC age साठी Default 18 आणि name साठी unknown दाखवतो.
Figure 3. Animation: name NOT NULL असताना नाव नसलेला insert ERROR 1364 ने fail; NOT NULL DEFAULT 'unknown' सह तोच insert चालतो; age INT DEFAULT 18 age सोडल्यावर 18 भरतो.
8. नियम काढा: column तो नियम सोडून परत लिहा
का: नियम बदलतात. कदाचित name परत optional करायचं असेल.
काय: "NOT NULL काढा" अशी वेगळी command नाही. MODIFY COLUMN पूर्ण column definition बदलतो, म्हणून जे सोडाल ते काढलं जातं.
Classroom line
To add something, write it in the query; to remove it, write the query without it.
Class मधलं वाक्य
"Kahitari add karaycha tar query madhe lihaycha, kadhun takaycha tar tyachya shivay lihaycha."
काहीतरी add करायचं तर query मध्ये लिहायचं, काढून टाकायचं तर त्याच्याशिवाय लिहायचं.
Classroom line
To add something, write it in the query; to remove it, write the query without it.
कसं:
-
Default ठेवून
NOT NULLकाढा:ALTER TABLE users MODIFY COLUMN name VARCHAR(20) DEFAULT 'unknown'; -
DESC users;Null = YESआणिDefault = unknownदाखवतो.
Classroom line
Write DEFAULT directly, without NOT NULL.
Class मधलं वाक्य
Not null शिवाय थेट default लिहा.
Classroom line – हिंदी
"Bina not null directly default likh do."
-
Default पण काढा:
ALTER TABLE users MODIFY COLUMN name VARCHAR(20); -
DESC users;Null = YESआणिDefault = NULLदाखवतो. - याच नियमाची दुसरी बाजू: फक्त size बदलताना सुद्धा नियम परत लिहा, नाहीतर ते चुकून जातात.
NOT NULL DEFAULT 'unknown'असलेल्या column वरMODIFY COLUMN name VARCHAR(30)दोन्ही नियम काढतो.
Figure 4. MODIFY पूर्ण column definition बदलतो: NOT NULL सोडलं तर ते जातं; DEFAULT सोडलं तर ते जातं.
9. DROP COLUMN, RENAME COLUMN आणि RENAME TO
का: कोणी न वापरणारे columns काढायला हवेत, आणि column मध्ये काय आहे ते त्याच्या नावावरून कळायला हवं.
काय:
DROP COLUMNcolumn आणि त्यातला सगळा data काढतो.RENAME COLUMN old TO newdata ठेवतो आणि फक्त नाव बदलतो.RENAME TOपूर्ण table चं नाव बदलतो.
कसं:
-
Phone column काढा:
ALTER TABLE users DROP COLUMN phone; -
cityचं नाव बदला, कारण त्यात पूर्ण पत्ते येणार आहेत:ALTER TABLE users RENAME COLUMN city TO address; -
DESC users;आताid,name,address,ageदाखवतो. -
Table चं नाव बदला:
ALTER TABLE users RENAME TO people; -
SHOW TABLES;peopleदाखवतो.ALTER TABLE people RENAME TO users;ने परत नाव बदला (RENAME TABLE people TO users;पण तेच करतं). RENAME COLUMNला MariaDB 10.5 किंवा नवीन लागतो. जुन्या server वरCHANGEवापरा, त्याला जुनं नाव, नवं नाव आणि पूर्ण type लागतो:ALTER TABLE users CHANGE city address VARCHAR(50);

Whiteboard: ALTER TABLE users DROP COLUMN phone, phone शिवाय DESC, मग ALTER TABLE users RENAME COLUMN city TO address.
Figure 5. Animation: ADD COLUMN phone INT, MODIFY COLUMN phone VARCHAR(15), मग DROP COLUMN phone आणि RENAME COLUMN city TO address, प्रत्येक step नंतर DESC सह.
10. Tables ना keys का लागतात
का: त्या दोन सारख्या rahul rows बघा. त्यातल्या एकाचं नाव बदलायचं आहे असं समजा.
कसं:
-
नावाने करून बघा:
UPDATE users SET name = 'rahul k' WHERE name = 'rahul'; -
MariaDB
Rows matched: 2 Changed: 2असं उत्तर देतो. दोन्ही rows बदलल्या. WHERE id = 3पण दोन्हीला जुळेल, कारण दोघांचा id 3 आहे.- दोन सारख्या rows पैकी नेमकी एक कोणतीच query निवडू शकत नाही. Table ला असा column हवा ज्याची value प्रत्येक row मध्ये वेगळी असेल, आणि कधीच रिकामी नसेल.
Classroom line
A column whose values are all unique, and never empty, is what we call the primary key.
Class मधलं वाक्य
"Jya column madhe saglya values unique astat tyala primary key mhanto."
ज्या column मध्ये सगळ्या values unique असतात, आणि कधीच रिकाम्या नसतात, त्याला primary key म्हणतो.
Classroom line
A column whose values are all unique, and never empty, is what we call the primary key.
काय: Key म्हणजे database एका column वर लावतो तो नियम. हा chapter दोन keys बघतो: primary key आणि unique key. तिसरी, foreign key, दोन tables जोडते; ती पुढच्या SQL chapter मध्ये.
11. Primary key विरुद्ध unique key
का: हा interviewer चा आवडता SQL प्रश्न आहे, आणि याच्या उत्तरावरून तुम्ही प्रत्येक table कसा design करता ते ठरतं.
Classroom line
The favourite interview question: the difference between a primary key and a unique key.
Class मधलं वाक्य
"Interview madhe favorite question: difference between primary key and unique key."
Interview मधला आवडता प्रश्न: primary key आणि unique key मधला फरक.
Classroom line
The favourite interview question: the difference between a primary key and a unique key.
काय:
- दोन्ही duplicates नाकारतात.
- Primary key मध्ये
NULLकधीच चालत नाही. Column primary key केला की तोNOT NULLहोतो. - Unique key मध्ये
NULLचालतो, अनेक rows मध्ये सुद्धा, कारणNULLम्हणजे "माहीत नाही" आणि तो कशाच्याच बरोबर नसतो. - एका table ला फक्त एकच primary key असतो. दोन लिहिले तर
ERROR 1068 (42000): Multiple primary key defined. तो एक primary key अनेक columns मिळून पण असू शकतो, उदा.PRIMARY KEY (a, b). - एका table ला अनेक unique keys असू शकतात: email, phone, username, प्रत्येक unique.
DESCprimary key साठीPRIआणि unique key साठीUNIदाखवतो.- जवळपास कोणताही column type primary key होऊ शकतो:
INT,VARCHAR(10), अगदीDATEसुद्धा. सहसा छोटा number निवडतात, कारण तो लहान, fast असतो आणि कधी बदलावा लागत नाही.
Classroom line
A table has only one primary key, but it can have many unique key columns.
Class मधलं वाक्य
"Ekach table la ekach primary key cha column asel, multiple unique key che column asu shaktat."
एका table ला एकच primary key चा column असेल, multiple unique key चे columns असू शकतात.
Classroom line
A table has only one primary key, but it can have many unique key columns.
Classroom line
With a primary key, duplicates cannot be added.
Class मधलं वाक्य
Primary key वापरला तर duplicates add होणार नाहीत.
Classroom line – हिंदी
"Primary key use karne se duplicates add nahi honge."
कसं: users चा id primary key करा.
-
लगेच करून बघा:
ALTER TABLE users MODIFY COLUMN id INT PRIMARY KEY; -
Fail होतो:
ERROR 1062 (23000): Duplicate entry '3' for key 'PRIMARY'. दोनrahul krows चा id अजून 3 च आहे. (NULLid असता तरी असंच अडलं असतं.) -
आधी data साफ करा. दोन सारख्या rows पैकी एक काढा:
DELETE FROM users WHERE id = 3 LIMIT 1; -
आता ids 1 ते 6 सगळे वेगळे आहेत, म्हणून step 1 मधला
ALTER TABLEचालेल. आत्ता चालवू नका: पुढच्या section मध्ये आपणidprimary key करू आणिAUTO_INCREMENTएकाच command मध्ये जोडू. - Best practice: प्रत्येक table ला primary key द्या. SQL तुम्हाला भाग पाडत नाही; primary key नसलेला table चालतो. पण मग वर पाहिलंत तसं, दोन सारख्या rows कधीच वेगळ्या ओळखता येत नाहीत.
Figure 6. Primary key विरुद्ध unique key: दोन्ही duplicates नाकारतात; primary key मध्ये NULL कधीच नाही आणि एका table ला एकच; unique key मध्ये NULL चालतो आणि एका table ला अनेक असू शकतात.
12. AUTO_INCREMENT: id MariaDB ला ठरवू द्या
का: लोक हाताने ids टाकतात (1, 5, 500 ...), तेव्हा पुढच्या user ला कोणता id द्यायचा ते कोणालाच कळत नाही, आणि दोघं एकच id निवडू शकतात.
Classroom line
If IDs are typed in randomly, you can't tell what ID to write for a new record.
Class मधलं वाक्य
वाटेल ते ID टाकले, तर नवीन record साठी कोणता ID लिहायचा ते समजत नाही.
Classroom line – हिंदी
"Aade tede kahi pan ID dal diye, to ab new record ke liye samajh nahi aata ID kya likhu."
काय: AUTO_INCREMENT प्रत्येक नवीन row ला पुढचा number आपोआप देतो: आतापर्यंतचा सगळ्यात मोठा id, अधिक 1. त्या column वर key असावा लागतो, सहसा primary key.
कसं:
- Key शिवाय MariaDB नाकारतो:
ALTER TABLE users MODIFY COLUMN id INT AUTO_INCREMENT;ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a keyदेतो. -
दोन्ही एकाच command मध्ये करा:
ALTER TABLE users MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT; -
DESC users;id int(11),Null NO,Key PRI,Extra auto_incrementदाखवतो. -
id न देता insert करा:
INSERT INTO users (name, address) VALUES ('pooja', 'satara'); -
pooja ला id 7 मिळतो: सगळ्यात मोठा id 6 होता.
Classroom line
If you use auto_increment, you needn't write the id; it increases the id by itself.
Class मधलं वाक्य
Auto_increment वापरत असाल तर id लिहायची गरज नाही, तो आपोआप id वाढवेल.
Classroom line – हिंदी
"Auto_increment use kar rahe hain to id likhne ki zarurat nahi, wo apne aap id badhayega."
-
मोकळा असेल तर तुम्ही अजूनही स्वतः id देऊ शकता. घेतलेला id नाकारला जातो:
INSERT INTO users (id, name, address) VALUES (1, 'meera', 'kolhapur'); -
हे
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'देतं. - मोकळा id चालतो:
INSERT INTO users (id, name, address) VALUES (10, 'meera', 'kolhapur'); - Counter त्याच्या पुढे उडी मारतो. id न देता पुढचा insert,
('arjun', 'pune'), ला 11 मिळतो, 8 नाही. Ids 8 आणि 9 कधीच वापरले जात नाहीत.
13. AUTO_INCREMENT मध्ये gaps का राहतात
का: Interviewers हे पण विचारतात: "मी शेवटची row delete केली; पुढच्या row ला तिचा id परत का मिळाला नाही?"
Classroom line
Once an insert is rejected, that id is used up.
Class मधलं वाक्य
"Reject zala ki ti id waste jaate."
Reject झाला की ती id waste जाते.
Classroom line
Once an insert is rejected, that id is used up.
काय: Table एक counter ठेवतो जो फक्त पुढे जातो. एकदा दिलेला id परत कधीच दिला जात नाही, त्याची row delete झाली किंवा insert fail झाला तरी. हे मुद्दाम असं आहे: अनेक sessions एकाच वेळी insert करू शकतात, आणि प्रत्येकाला इतरांची वाट न बघता स्वतःचा number मिळतो. Numbers परत वापरायला मागे गेलं तर ते एकमेकांत आदळतील.
कसं:
- arjun ला delete करा:
DELETE FROM users WHERE id = 11; - arjun ला परत टाका:
INSERT INTO users (name, address) VALUES ('arjun', 'pune'); - त्याला 12 मिळतो, 11 नाही.
- Fail झालेला insert पण एक number वापरतो. Section 14 मध्ये duplicate नावाचा insert fail होतो; पुढचा यशस्वी insert एक number सोडतो.
- म्हणून ids मध्ये gaps नाहीत असं कधीच मानू नका, आणि rows मोजायला ते वापरू नका. त्यासाठी
SELECT COUNT(*) FROM users;वापरा. INT2,147,483,647 ला थांबतो. त्यापेक्षा मोठा होऊ शकेल अशा table साठी id लाBIGINTवापरा.
Figure 7. Animation: AUTO_INCREMENT counter 7 देतो (सगळ्यात मोठा + 1) आणि घेतलेला id नाकारतो; निवडलेल्या 10 मुळे counter 11 वर उडी मारतो; 11 delete केल्यावर आणि 13 वापरणाऱ्या fail insert नंतर नवीन rows ना 12 आणि 14 मिळतात.
Ravindra Bagale's Tip
id ला कधीच परत न दिल्या जाणाऱ्या roll number सारखं वागवा: तो फक्त row ओळखतो. Users ना तो count म्हणून दाखवू नका, gaps हाताने भरू नका, आणि दुसरा data त्याला refer करायला लागल्यावर तो बदलू नका. लोकांना दिसणारा number हवा असेल, उदा. order number, तर तो वेगळ्या column मध्ये ठेवा.
14. असलेल्या column ला UNIQUE लावा
का: खऱ्या app मध्ये email किंवा username एकाच व्यक्तीचा असला पाहिजे. इथे आपण name वर practice करतो.
Classroom line
Names usually aren't unique, but right now we just want to try it out.
Class मधलं वाक्य
साधारणपणे name unique नसतं, पण आत्ता practical करून बघायचं आहे.
Classroom line – हिंदी
"Generally name unique nahi rehta, lekin abhi practical karke dekhna hai."
कसं:
-
नियम लावा:
ALTER TABLE users MODIFY COLUMN name VARCHAR(20) UNIQUE; -
चालतो, कारण कोणत्याच दोन rows चं नाव सारखं नाही. असतं तर, ते ठीक करेपर्यंत
ERROR 1062आला असता. DESC users;nameसाठीUNIदाखवतो,idच्याPRIआणिauto_incrementशेजारी.-
दुसरा amit टाका:
INSERT INTO users (name, address) VALUES ('amit', 'mumbai'); -
Fail होतो:
ERROR 1062 (23000): Duplicate entry 'amit' for key 'name'. Unique key ला त्याच्या column चं नाव मिळतं. - कोणीतरी नवीन टाका:
INSERT INTO users (name, address) VALUES ('isha', 'nagpur');isha ला id 14 मिळतो: fail झालेल्या amit insert ने 13 वापरला. NULLचालतो, दोनदा सुद्धा:INSERT INTO users (name, address) VALUES (NULL, 'pune'), (NULL, 'nashik');चालतो.DELETE FROM users WHERE name IS NULL;ने त्या परत काढा.- अगदी नवीन column साठी, जोडतानाच नियम लिहा:
ALTER TABLE users ADD COLUMN email VARCHAR(100) UNIQUE;
Classroom line
What does unique mean? The name must not repeat.
Class मधलं वाक्य
"Unique cha matlab kay aahe, name repeat nahi zala pahije."
Unique चा मतलब काय आहे, name repeat नाही झालं पाहिजे.
Classroom line
What does unique mean? The name must not repeat.

Whiteboard: ALTER TABLE users MODIFY COLUMN name VARCHAR(20) UNIQUE; DESC id ला auto_increment सह PRI आणि name ला UNI दाखवतो.
15. DELETE विरुद्ध TRUNCATE विरुद्ध DROP
का: तिघंही काहीतरी "काढतात", आणि त्यांचा फरक हा classic interview प्रश्न आहे. चुकीचा निवडला तर पूर्ण table जाऊ शकतो.
काय:
DELETEतुम्हीWHEREने निवडलेल्या rows एक-एक करून काढतो;WHEREनसेल तर प्रत्येक row. Table राहतो, आणिAUTO_INCREMENTcounter पुढे मोजत राहतो. Safe update mode याला लागू होतो.TRUNCATE TABLEपूर्ण table एका झटक्यात रिकामा करतो. त्यालाWHEREनाही. Structure राहतं, आणि counter परत 1 पासून सुरू होतो. मोठ्या table वर पण fast.DROP TABLEtable च काढतो: structure आणि data.DROP DATABASEdatabase आणि त्यातले सगळे tables काढतो.
Classroom line
With DELETE, rows are deleted one by one; with TRUNCATE, all the data is deleted.
Class मधलं वाक्य
"Delete ne one by one row delete hotil, truncate ne purna data delete hoil."
Delete ने one by one row delete होतील, truncate ने पूर्ण data delete होईल.
Classroom line
With DELETE, rows are deleted one by one; with TRUNCATE, all the data is deleted.
कसं:
- निवडलेल्या rows delete करा:
DELETE FROM users WHERE id = 4; - प्रत्येक row delete करा:
DELETE FROM users;Query OK, 9 rows affectedअसं उत्तर देतो. - एक row टाका:
INSERT INTO users (name) VALUES ('test');तिला id 17 मिळतो:DELETEने counter reset केला नाही. TRUNCATEने table रिकामा करा:TRUNCATE TABLE users;
Classroom line
Delete everything inside the table, only the data, but not the table's structure.
Class मधलं वाक्य
"Table chya aat je kahi aahe te sagla delete karaycha, fakt data, pan table cha structure delete nahi karaycha."
Table च्या आत जे काही आहे ते सगळं delete करायचं, फक्त data, पण table चं structure delete नाही करायचं.
Classroom line
Delete everything inside the table, only the data, but not the table's structure.
- तीच row परत टाका. आता तिला id 1 मिळतो:
TRUNCATEने counter reset केला. DESC users;अजूनही चारही columns त्यांच्या keys सह दाखवतो. फक्त data गेला.- Table काढा:
DROP TABLE users; DESC users;आताERROR 1146 (42S02): Table 'instagram.users' doesn't existदेतो.- पूर्ण practice database काढा:
DROP DATABASE instagram;PromptMariaDB [(none)]>होतो. SHOW DATABASES;मध्ये आताinstagramनाही.- यापैकी काहीच client मध्ये undo होत नाही.
DELETEआधी तोचWHERESELECTने चालवा; खऱ्या data वरTRUNCATEकिंवाDROPआधी backup ठेवा.
![MariaDB terminal: drop table users; Query OK. desc users; ERROR 1146 (42S02): Table 'instagram.users' doesn't exist. drop database instagram; Query OK, 1 row affected. The prompt becomes MariaDB [(none)]. show databases; lists amazon, information_schema, insta, mysql, performance_schema, wordpressdb.](../../../assets/img/aws/sql-alter-table-primary-key-unique-auto-increment-07-mariadb-drop-table-and-database.webp)
Whiteboard: DROP TABLE users, मग DESC users ERROR 1146 ने fail; DROP DATABASE instagram, आणि SHOW DATABASES मध्ये तो आता नाही.
Figure 8. DELETE निवडलेल्या rows काढतो आणि table व id counter ठेवतो; TRUNCATE table रिकामा करतो आणि counter 1 पासून सुरू करतो; DROP table, किंवा पूर्ण database, काढतो.
Practice झाल्यावर exit; type करा आणि EC2 instance stop करा.
16. पूर्ण class एका page वर
UPDATEdata बदलतो;ALTER TABLEstructure बदलतो.SELECT @@SQL_SAFE_UPDATES;SET SQL_SAFE_UPDATES = 1;WHEREमध्ये key column किंवाLIMITनसलेलेUPDATE/DELETEअडवतो (ERROR 1175), या session पुरतं.ALTER TABLE t ADD COLUMN c type;नवीन column, जुन्या rows मध्येNULL.ALTER TABLE t MODIFY COLUMN c newtype;लहानाकडून मोठ्याकडे सुरक्षित; मोठ्याकडून लहानाकडे प्रत्येक value बसली तरच (ERROR 1265,ERROR 1264).- Phone numbers
VARCHAR;INT2,147,483,647 ला थांबतो, आणिint(11)फक्त display width. NOT NULLvalue compulsory करतो (ERROR 1364); आधी असलेलेNULLठीक करा.DEFAULT xनवीन rows मध्ये सोडलेला column भरतो.- नियम काढायला column तो नियम सोडून
MODIFYकरा. DROP COLUMN c,RENAME COLUMN a TO b,RENAME TO newname.- Primary key: duplicates नाही,
NULLनाही, एका table ला एक. Unique: duplicates नाही,NULLचालतो, एका table ला अनेक. INT PRIMARY KEY AUTO_INCREMENT: सगळ्यात मोठा + 1; घेतलेला idERROR 1062देतो; delete आणि fail inserts नंतर gaps normal.DELETEनिवडलेल्या rows (counter पुढे चालू);TRUNCATEसगळ्या rows (counter परत सुरू);DROPtable किंवा database.
17. Hands-on lab: table ची रचना सुरक्षितपणे बदला
हा lab का. Apps बदलतात, म्हणून tables बदलतात. हा lab छोट्या, फेकून देता येणाऱ्या table वर columns जोडतो आणि बदलतो, rules आणि keys जोडतो, आणि येणारा प्रत्येक error दाखवतो.
- छोटा table बनवा
- Command:
CREATE TABLE staff (id INT, name VARCHAR(20), city VARCHAR(20)); INSERT INTO staff VALUES (1,'ravi','pune'),(2,'neha','mumbai'),(3,'amit','nashik'); - काय दिसेल:
Query OK, 0 rows affected, मगQuery OK, 3 rows affected. - Check करा:
SELECT * FROM staff;→ 3 rows. - का: Structure वर प्रयोग करताना वेगळा table तुमचा खरा practice data सुरक्षित ठेवतो.
- Command:
- Column जोडा
- Command:
ALTER TABLE staff ADD COLUMN phone VARCHAR(15); - काय दिसेल:
Query OK, 0 rows affectedआणिRecords: 0 Duplicates: 0 Warnings: 0. - Check करा:
SELECT * FROM staff;मध्ये तिन्ही rows साठीphoneNULL. - का:
ALTER TABLEdata नाही, structure बदलतो, म्हणून कोणतीही row "affected" नाही.INTनाहीVARCHAR, कारण phone numbers 0 किंवा+ने सुरू होऊ शकतात.
- Command:
- name compulsory करा
- Command:
ALTER TABLE staff MODIFY COLUMN name VARCHAR(30) NOT NULL; - काय दिसेल:
Query OKआणिDuplicates: 0 Warnings: 0. - Check करा:
INSERT INTO staff (id, city) VALUES (4, 'goa');→ERROR 1364 (HY000): Field 'name' doesn't have a default value - का: App तपासायला विसरलं तरी आता database स्वतः नावाशिवायची row नाकारतो.
MODIFYपूर्ण column परत लिहितो, म्हणून type परत लिहायचा.
- Command:
- Primary key जोडा
- Command:
ALTER TABLE staff ADD PRIMARY KEY (id); - काय दिसेल:
Query OKआणिDuplicates: 0 Warnings: 0. - Check करा:
INSERT INTO staff (id, name) VALUES (1, 'raj');→ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' - का: Primary key प्रत्येक row एका unique, non-NULL value ने शोधता येईल असं करतो. तो नसेल तर दोन सारख्या rows वेगळ्या ओळखता येत नाहीत.
- Command:
- ids MariaDB ला निवडू द्या
- Command:
ALTER TABLE staff MODIFY COLUMN id INT AUTO_INCREMENT; INSERT INTO staff (name, city) VALUES ('raj', 'goa'); - काय दिसेल: दोनदा
Query OK. - Check करा:
SELECT id, name FROM staff WHERE name = 'raj';→4 | raj - का: शेवटचा id कोणालाही लक्षात ठेवावा लागत नाही; MariaDB पुढचा number वापरतो. Key column वरचा
MODIFYkey ठेवतो, म्हणून primary key राहतो.
- Command:
- Safe updates चालू करा
- Command:
SET SQL_SAFE_UPDATES = 1; UPDATE staff SET city = 'pune'; - काय दिसेल:
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column - Check करा: एकही row बदलली नाही:
SELECT city FROM staff;अजूनही चार वेगवेगळी शहरं दाखवतो. - का: Safe mode म्हणजे seat belt:
WHEREमध्ये key नसलेलेUPDATEआणिDELETEतो अडवतो. तो फक्त या session पुरता.
- Command:
- Key ने एक row update करा
- Command:
UPDATE staff SET city = 'solapur' WHERE id = 4; - काय दिसेल:
Query OK, 1 row affected - Check करा:
SELECT city FROM staff WHERE id = 4;→solapur - का:
WHEREमधला primary key नेमकी एकच row बदलेल याची खात्री देतो, म्हणून safe mode परवानगी देतो.
- Command:
- Delete नंतरचं gap बघा
- Command:
DELETE FROM staff WHERE id = 4; INSERT INTO staff (name, city) VALUES ('sara', 'goa'); - काय दिसेल: दोनदा
Query OK, 1 row affected. - Check करा:
SELECT id, name FROM staff;ids1, 2, 3, 5दाखवतो. - का:
AUTO_INCREMENTकधीच number परत वापरत नाही, म्हणून delete झालेला id gap राहतो. परत वापरला तर जुने आणि नवीन records मिसळू शकतात.
- Command:
- रिकामा करा, मग काढा
- Command:
TRUNCATE TABLE staff; DROP TABLE staff; - काय दिसेल: दोनदा
Query OK, 0 rows affected. - Check करा:
DESC staff;→ERROR 1146 (42S02): Table 'instagram.staff' doesn't exist(तुमच्या database चं नाव वेगळं असू शकतं). - का:
TRUNCATEtable रिकामा करतो आणि counter reset करतो;DROPtable च काढून टाकतो. दोघांनाही undo नाही, म्हणून ते practice tables साठीच ठेवा.
- Command:
18. Try at home
Try at home
Task 1: safe updates
@@SQL_SAFE_UPDATESतपासा, मग on करा.WHEREशिवायUPDATEकरून बघा आणि error वाचा.LIMITलावून तो चालवा. मग logout करा, परत login करा आणि setting परत तपासा.
Task 2: table बदला
id INT,name VARCHAR(20)आणिprice INTअसलेलाproductstable बनवा, आणि तीन rows टाका.codecolumn जोडा, मग तोINTवरूनVARCHAR(10)करा.nameलाNOT NULL DEFAULT 'no name'करा, आणि नाव नसलेली row टाका.- Default ठेवून
NOT NULLकाढा. प्रत्येक stepDESCने तपासा. priceचं नावmrpकरा, मग table चं नावitemsकरा.
Task 3: keys
idलाPRIMARY KEY AUTO_INCREMENTकरा. Fail झालं, तर आधी duplicate शोधून ठीक करा.- id न देता दोन rows टाका आणि त्यांचे ids लिहून ठेवा.
- शेवटची row delete करा, परत insert करा, आणि नवीन id का आला ते सांगा.
UNIQUEemail column जोडा आणि तोच email दोनदा टाका. मगNULLदोनदा टाका.
Task 4: data काढा
- सगळ्या rows
DELETEकरा, एक टाका, आणि तिचा id लिहा. - Table
TRUNCATEकरा, एक टाका, आणि id ची तुलना करा. - Table
DROPकरा आणिDESCने खात्री करा.
Recap
थोडक्यात
UPDATErows मधल्या values बदलतो;ALTER TABLEcolumns, types, नावं आणि नियम बदलतो.- Safe update mode (
SQL_SAFE_UPDATES = 1)WHEREमध्ये key column किंवाLIMITनसलेलेUPDATEआणिDELETEERROR 1175ने नाकारतो; तो तुमच्या session पुरता असतो. ADD COLUMNअसलेल्या rows मध्येNULLसह column जोडतो;MODIFY COLUMNत्याचा type किंवा size बदलतो आणि प्रत्येक value बसली तरच चालतो.- Phone numbers
VARCHARमध्ये ठेवा:INT2,147,483,647 ला थांबतो आणि पुढचा+किंवा0घालवतो. NOT NULLvalue compulsory करतो (ERROR 1364);DEFAULTसोडलेली value भरतो; नियम काढायला column तो नियम सोडून परत लिहा.DROP COLUMNcolumn आणि त्याचा data काढतो;RENAME COLUMNआणिRENAME TOफक्त नावं बदलतात.- Primary key मध्ये duplicates नाही आणि
NULLनाही, एका table ला एक; unique key मध्ये duplicates नाही पणNULLचालतो, एका table ला अनेक. प्रत्येक table ला primary key द्या. AUTO_INCREMENTला key लागतो आणि तो सगळ्यात मोठा + 1 देतो; counter फक्त पुढे जातो, म्हणून gaps normal.DELETEनिवडलेल्या rows काढतो आणि counter ठेवतो;TRUNCATEtable रिकामा करतो आणि counter परत सुरू करतो;DROPtable किंवा database काढतो.
सराव Tasks
Sangli Turmeric Traders हा सांगली मधला मसाले व्यापार व्यवसाय आहे. Dattatray Chavan त्यांचं IT व cloud काम पाहतात. त्यांचे पैसे INR मध्ये मोजले जातात आणि AWS resources ap-south-1 Region मध्ये चालतात. खालच्या tasks मध्ये तुम्ही या lesson मध्ये शिकलेलं वापरून त्यांची खरी कामं करता. सगळी नावं, account IDs, IP addresses व numbers सरावासाठी काल्पनिक आहेत.
0 / 10
सोपं मोठ्या orders आधी
का: RDS setup नंतर database query करणं रोजचं काम.
काय करायचं: Order id व amount, मोठी amount आधी.
Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).
- Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
- SQL statement step by step लिहा: काय, कुठून, कोणते rows.
- Statement ; ने संपवा.
- Check answer दाबा. Query table च्या practice copy वर चालते.
सोपं City नुसार customers
का: RDS setup नंतर database query करणं रोजचं काम.
काय करायचं: Pune मधल्या customers ची नावं.
Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).
- Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
- SQL statement step by step लिहा: काय, कुठून, कोणते rows.
- Statement ; ने संपवा.
- Check answer दाबा. Query table च्या practice copy वर चालते.
सोपं MariaDB मध्ये login करा
का: mysql client ने database server वर SQL चालवता येतं.
काय करायचं: MariaDB client root user म्हणून उघडा व password विचारू द्या.
- हे काम करणारा Linux command शोधा.
- Task ला लागणारे options (उदा. -r, -h) जोडा.
- File नावं, folders किंवा users योग्य क्रमाने लिहा.
- System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.
मध्यम एकूण sales
का: RDS setup नंतर database query करणं रोजचं काम.
काय करायचं: सगळ्या order amounts ची बेरीज.
Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).
- Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
- SQL statement step by step लिहा: काय, कुठून, कोणते rows.
- Statement ; ने संपवा.
- Check answer दाबा. Query table च्या practice copy वर चालते.
मध्यम Customer नावांसह orders
का: RDS setup नंतर database query करणं रोजचं काम.
काय करायचं: प्रत्येक customer नाव व order amount.
Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).
- Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
- SQL statement step by step लिहा: काय, कुठून, कोणते rows.
- Statement ; ने संपवा.
- Check answer दाबा. Query table च्या practice copy वर चालते.
मध्यम लहान orders काढा
का: RDS setup नंतर database query करणं रोजचं काम.
काय करायचं: 200 पेक्षा कमी amount चे orders delete.
Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).
- Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
- SQL statement step by step लिहा: काय, कुठून, कोणते rows.
- Statement ; ने संपवा.
- Check answer दाबा. Query table च्या practice copy वर चालते.
मध्यम City दुरुस्त करा
का: RDS setup नंतर database query करणं रोजचं काम.
काय करायचं: Customer 5 Rome ला गेले. Record update करा.
Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).
- Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
- SQL statement step by step लिहा: काय, कुठून, कोणते rows.
- Statement ; ने संपवा.
- Check answer दाबा. Query table च्या practice copy वर चालते.
अवघड Customer नुसार sales
का: RDS setup नंतर database query करणं रोजचं काम.
काय करायचं: Customer नुसार total, फक्त 1000 पेक्षा जास्त.
Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).
- Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
- SQL statement step by step लिहा: काय, कुठून, कोणते rows.
- Statement ; ने संपवा.
- Check answer दाबा. Query table च्या practice copy वर चालते.
अवघड Orders नसलेले customers
का: RDS setup नंतर database query करणं रोजचं काम.
काय करायचं: कधीच order न केलेल्या customers ची नावं.
Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).
- Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
- SQL statement step by step लिहा: काय, कुठून, कोणते rows.
- Statement ; ने संपवा.
- Check answer दाबा. Query table च्या practice copy वर चालते.
अवघड Database चा file मध्ये backup घ्या
का: mysqldump पूर्ण database SQL म्हणून लिहितो. मोठ्या बदलांआधी save करा.
काय करायचं: sanglihaldi_wp database root user ने (password विचारून) sanglihaldi_wp.sql मध्ये dump करा.
- हे काम करणारा Linux command शोधा.
- Task ला लागणारे options (उदा. -r, -h) जोडा.
- File नावं, folders किंवा users योग्य क्रमाने लिहा.
- System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.
झटपट उजळणी cards
हा lesson दोन मिनिटांत revise करा. Cards phone वर save करा किंवा PNG download करा. प्रत्येक card वरचा QR त्याचा lesson उघडतो.










अजून cards: Ravi Sir's Cards.