INSERT में एक्सप्रेशन का उपयोग
MySQL में INSERT स्टेटमेंट के VALUES क्लॉज में फंक्शन कॉल और एक्सप्रेशन उपयोग किए जा सकते हैं, जिससे अलग UPDATE की आवश्यकता नहीं होती।
उदाहरण: टेबल बनाना
mysql> CREATE TABLE DemoTable816(DueDate DATETIME); Query OK, 0 rows affected (0.45 sec)
INSERT के दौरान डेट में अंतराल जोड़ना
mysql> INSERT INTO DemoTable816 VALUES(DATE_ADD(NOW(), INTERVAL 3 MINUTE));
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO DemoTable816 VALUES(DATE_ADD('2018-01-21 00:00:00', INTERVAL 3 HOUR));
Query OK, 1 row affected (0.52 sec)
mysql> INSERT INTO DemoTable816 VALUES(DATE_ADD('2016-11-11 12:40:00', INTERVAL 3 DAY));
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO DemoTable816 VALUES(DATE_ADD('2018-12-01 11:00:00', INTERVAL 3 MONTH));
Query OK, 1 row affected (0.18 sec)
mysql> INSERT INTO DemoTable816 VALUES(DATE_ADD('2011-03-21 10:00:00', INTERVAL 3 YEAR));
Query OK, 1 row affected (0.16 sec)
परिणाम देखना
mysql> SELECT * FROM DemoTable816;
+---------------------+ | DueDate | +---------------------+ | 2019-08-03 13:08:43 | | 2018-01-21 03:00:00 | | 2016-11-14 12:40:00 | | 2019-03-01 11:00:00 | | 2014-03-21 10:00:00 | +---------------------+ 5 rows in set (0.00 sec)
उपयोग किए गए फंक्शन्स
| फंक्शन | उद्देश्य |
|---|---|
DATE_ADD(date, INTERVAL expr unit) | डेट/टाइम में अंतराल जोड़ें |
DATE_SUB(date, INTERVAL expr unit) | डेट/टाइम से अंतराल घटाएं |
NOW() | वर्तमान डेटटाइम |
CURDATE() | वर्तमान डेट |
CURTIME() | वर्तमान समय |
INTERVAL यूनिट्स
INTERVAL 3 MINUTE INTERVAL 3 HOUR INTERVAL 3 DAY INTERVAL 3 MONTH INTERVAL 3 YEAR INTERVAL 3 WEEK INTERVAL 3 QUARTER INTERVAL 3 SECOND INTERVAL 3 MICROSECOND INTERVAL '3:30' HOUR_MINUTE INTERVAL '1 3' DAY_HOUR
अन्य INSERT-टाइम एक्सप्रेशन उदाहरण
डिफ़ॉल्ट मान के रूप में फंक्शन
CREATE TABLE Events (
Id INT AUTO_INCREMENT PRIMARY KEY,
EventName VARCHAR(100),
CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
ExpiresAt DATETIME DEFAULT (DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 30 DAY))
);
गणना किए गए कॉलम (Generated Columns - MySQL 5.7+)
CREATE TABLE Orders (
Id INT AUTO_INCREMENT PRIMARY KEY,
Price DECIMAL(10,2),
Qty INT,
Total DECIMAL(10,2) AS (Price * Qty) STORED
);
INSERT ... SELECT में एक्सप्रेशन
INSERT INTO ArchiveTable (Id, Data, ArchivedAt) SELECT Id, Data, NOW() FROM ActiveTable WHERE Status = 'Done';
लाभ
- एटॉमिक: गणना और इन्सर्ट एक ही ऑपरेशन में
- प्रदर्शन: अलग UPDATE क्वेरी की आवश्यकता नहीं
- संगति: रेस कंडीशन का कोई जोखिम नहीं
- ट्रिगर अल्टरनेटिव: सरल गणनाओं के लिए ट्रिगर से बचें
नोट
सबक्वेरी और फंक्शन कॉल VALUES में अनुमत हैं, लेकिन कुछ प्रतिबंध लागू होते हैं (उदाहरण के लिए, उसी टेबल से SELECT नहीं जिस पर इन्सर्ट कर रहे हैं, जब तक कि यह सबक्वेरी में न हो)।