MySQL में कॉलम डिफ़ॉल्ट मान के लिए फंक्शन सीधे उपयोग नहीं कर सकते (केवल स्थिर मान या CURRENT_TIMESTAMP अनुमत हैं)। समाधान: ट्रिगर उपयोग करें।
समस्या
-- यह काम नहीं करेगा:
CREATE TABLE t (id INT DEFAULT UUID()); -- त्रुटि
CREATE TABLE t (created DATETIME DEFAULT NOW()); -- केवल CURRENT_TIMESTAMP काम करता है
समाधान: BEFORE INSERT ट्रिगर
CREATE TABLE TbLFunctionTrigger (
id CHAR(36), -- UUID के लिए
username VARCHAR(100),
created_at DATETIME
);
CREATE TRIGGER insertBef
BEFORE INSERT ON TbLFunctionTrigger
FOR EACH ROW
BEGIN
SET NEW.id = UUID();
SET NEW.created_at = NOW();
END;
टेस्ट
mysql> INSERT INTO TbLFunctionTrigger (username) VALUES ('john');
mysql> SELECT * FROM TbLFunctionTrigger;
+--------------------------------------+----------+---------------------+
| id | username | created_at |
+--------------------------------------+----------+---------------------+
| a1b2c3d4-e5f6-7890-abcd-ef1234567890 | john | 2024-01-15 10:30:00 |
+--------------------------------------+----------+---------------------+
अन्य उपयोगी ट्रिगर पैटर्न
-- UPDATE पर updated_at ऑटो-अपडेट
CREATE TRIGGER update_ts
BEFORE UPDATE ON my_table
FOR EACH ROW
SET NEW.updated_at = NOW();
-- जटिल डिफ़ॉल्ट: सीक्वेंस नंबर
CREATE TRIGGER seq_num
BEFORE INSERT ON orders
FOR EACH ROW
SET NEW.order_no = CONCAT('ORD-', DATE_FORMAT(NOW(), '%Y%m%d'), '-',
LPAD((SELECT COALESCE(MAX(CAST(SUBSTRING(order_no, -4) AS UNSIGNED)), 0) + 1
FROM orders
WHERE order_no LIKE CONCAT('ORD-', DATE_FORMAT(NOW(), '%Y%m%d'), '-%')), 4, '0'));
MySQL 8.0.13+ अपवाद
CURRENT_TIMESTAMP, NOW(), UUID() (केवल डिफ़ॉल्ट के रूप में नहीं, बल्कि DEFAULT (UUID()) सिंटैक्स के साथ) कुछ फंक्शन अब डिफ़ॉल्ट में अनुमत हैं:
CREATE TABLE t (
id CHAR(36) DEFAULT (UUID()),
created DATETIME DEFAULT CURRENT_TIMESTAMP
);
लेकिन ट्रिगर तरीका सभी संस्करणों पर काम करता है और अधिक लचीला है।