UPDATE और DELETE Commands
UPDATE Rows बदलता; DELETE Rows हटाता है
UPDATE existing rows की values बदलता है। DELETE existing rows हटाता है। दोनों powerful हैं, क्योंकि एक statement एक row, हजारों rows या पूरी table प्रभावित कर सकता है।
| Command | उद्देश्य | Basic form |
|---|---|---|
UPDATE | Matching rows के एक या अधिक columns बदलना | UPDATE t SET c = value WHERE condition; |
DELETE | Matching rows हटाना | DELETE FROM t WHERE condition; |
पाँच चरण का Safe Workflow
- Recovery protect करें: current backup, tested restore plan या disposable copy रखें। Rollback चाहिए तो transactional engine confirm करें।
- Transaction शुरू करें: autocommit को change तुरंत permanent करने से रोकें।
- Exact target preview करें: same WHERE वाला SELECT चलाकर IDs और current values देखें।
- Change और verify करें: UPDATE/DELETE चलाकर affected rows और second SELECT जाँचें।
- Explicit choice करें: सही हो तो COMMIT, अन्यथा ROLLBACK।
START TRANSACTION;
SELECT student_id, full_name, marks, status
FROM students
WHERE student_id = 3
FOR UPDATE;
-- Intended UPDATE या DELETE यहाँ चलाएँ।
-- Result verify करें, फिर exactly one चुनें:
COMMIT;
-- ROLLBACK;
FOR UPDATE selected InnoDB rows को transaction end तक lock करता है, जिससे preview और write के बीच दूसरा transaction उन्हें न बदले। Transactions short रखें और broad locks से पहले application concurrency समझें।
Safe UPDATE Examples
Primary key से एक row update
START TRANSACTION;
SELECT student_id, full_name, marks
FROM students
WHERE student_id = 3
FOR UPDATE;
UPDATE students
SET marks = 78.00,
status = 'Active'
WHERE student_id = 3;
SELECT student_id, full_name, marks, status
FROM students
WHERE student_id = 3;
COMMIT;
कई rows intentionally update
START TRANSACTION;
SELECT student_id, full_name, marks
FROM students
WHERE class_name = 'X-B' AND status = 'Active'
ORDER BY student_id
FOR UPDATE;
UPDATE students
SET marks = LEAST(marks + 1.00, 100.00)
WHERE class_name = 'X-B'
AND status = 'Active';
SELECT student_id, full_name, marks
FROM students
WHERE class_name = 'X-B' AND status = 'Active'
ORDER BY student_id;
ROLLBACK;
Lab जानबूझकर rollback करता है। LEAST calculated mark को 100 से अधिक होने से रोकता और table CHECK constraint दूसरी protection line देता है।
Safe DELETE Examples
Arbitrary production student के बजाय known practice row ही delete करें:
START TRANSACTION;
INSERT INTO students (full_name, class_name, marks, status)
VALUES ('Temporary Record', 'TEST', NULL, 'Inactive');
SET @test_student_id = LAST_INSERT_ID();
SELECT student_id, full_name, class_name
FROM students
WHERE student_id = @test_student_id
FOR UPDATE;
DELETE FROM students
WHERE student_id = @test_student_id;
SELECT ROW_COUNT() AS rows_deleted;
SELECT student_id, full_name
FROM students
WHERE student_id = @test_student_id;
COMMIT;
Generated primary key target को precise बनाती है। Preview expected से अधिक या कम rows लौटाए तो delete से पहले रुकें और rollback करें।
Transactions, Autocommit और Rollback
MySQL sessions सामान्यतः autocommit enabled से शुरू होते हैं, इसलिए standalone UPDATE या DELETE तुरंत permanent हो सकता है। START TRANSACTION explicit transaction शुरू करता है। COMMIT changes durable और ROLLBACK uncommitted changes cancel करता है।
- Rollback protection के लिए InnoDB जैसा transactional storage engine चाहिए।
- कुछ DDL statements implicit commit कराते हैं; DML recovery plan में schema changes casually न मिलाएँ।
- Disconnected client open transaction rollback कर सकता है, पर disconnection को plan न बनाएँ।
- COMMIT के बाद transaction rollback change undo नहीं कर सकता। फिर backup और logs चाहिए।
- Locks और blocking घटाने के लिए transaction short रखें।
SELECT @@autocommit AS autocommit_setting;
SELECT ROW_COUNT() AS affected_by_previous_statement;
Client flags के अनुसार UPDATE message matched rows और actually changed rows अलग दिखा सकता है। केवल एक number नहीं, target IDs और final values verify करें।
DELETE, TRUNCATE और DROP
| Statement | क्या हटाता है | WHERE? | Object बचता है? |
|---|---|---|---|
DELETE FROM students WHERE ... | Matching rows | हाँ | हाँ |
DELETE FROM students | DELETE semantics से सभी rows | Filter नहीं | हाँ |
TRUNCATE TABLE students | DDL-like truncate behavior से सभी rows | नहीं | हाँ |
DROP TABLE students | Table definition और data | नहीं | नहीं |
TRUNCATE और DROP filtered DELETE की faster spelling नहीं हैं। Privileges, locking, logging, foreign-key restrictions, auto-increment effects और transaction behavior अलग हैं। Exact administrative intention और recovery ready होने पर ही use करें।
सामान्य गलतियाँ और Protection Layers
- Preview से पहले write: same WHERE को SELECT में copy कर primary keys inspect करें।
- Broad text condition: names unique नहीं होते; primary key या verified key set prefer करें।
- Automatically commit click करना: Verification के बाद रुकें और COMMIT conscious decision बनाएँ।
- SQL_SAFE_UPDATES को पर्याप्त मानना: यह session guardrail है; safe work रोक या unintended key-based work allow कर सकता है।
- NULL logic ignore करना:
WHERE marks = NULLकुछ match नहीं करता;IS NULLलें। - Live data पर testing: Copy या transaction lab बनाकर deliberately ROLLBACK करें।
- Backup restore test न करना: Never-restored backup unverified recovery plan है।
- User input concatenate करना: Application values के लिए prepared statements mandatory हैं।
अतिरिक्त safeguards के लिए Safe UPDATE and DELETE Practices और Transactions पढ़ें।
Safe Practice Lab
CREATE TABLE students_lab LIKE studentsसे lab table बनाएँ और INSERT SELECT से rows copy करें।- Transaction start करके FOR UPDATE के साथ primary key से one row preview करें।
- Row update और verify करके ROLLBACK करें; old value लौटना confirm करें।
- Temporary row insert करके केवल generated ID delete और result verify करें।
- Class condition से multi-row update दोहराएँ; affected key list predict और verify करें।
- समझाएँ कि SQL_SAFE_UPDATES backup और transaction को replace क्यों नहीं करता।
त्वरित सारांश
- UPDATE values बदलता; DELETE rows हटाता है।
- Precise WHERE लगाकर same condition SELECT से preview करें।
- Important work में backup, transaction, lock/preview, change, verify, फिर commit या rollback करें।
- DELETE, TRUNCATE और DROP की scope तथा recovery behavior अलग हैं।
- Guardrails useful हैं, पर disciplined review और tested recovery आवश्यक है।
Official संदर्भ
- UPDATE Statement — MySQL 8.4
- DELETE Statement — MySQL 8.4
- COMMIT और ROLLBACK Statements
- InnoDB Locking Reads
- sql_safe_updates Variable
- TRUNCATE TABLE Statement
References 14 August 2026 को review किए गए। Destructive statements केवल disposable data और recovery के साथ practice करें।