मुझे एक कथन में ऐसा करने का कोई तरीका नहीं पता, यहां तक कि ट्रिगर का उपयोग करके भी।
@Lucky द्वारा सुझाया गया ट्रिगर समाधान MySQL में ऐसा दिखाई देगा:
CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
SET NEW.group_id = COALESCE(NEW.group_id, NEW.id);
END
हालाँकि, एक समस्या है। BEFORE INSERT
. में चरण, स्वतः उत्पन्न id
मूल्य अभी तक उत्पन्न नहीं हुआ है। तो अगर group_id
शून्य है, यह डिफ़ॉल्ट रूप से NEW.id
है जो हमेशा 0 होता है।
लेकिन अगर आप AFTER INSERT
. के दौरान इस ट्रिगर को सक्रिय करने के लिए बदलते हैं चरण, इसलिए आपके पास NEW.id
. के जेनरेट किए गए मान तक पहुंच है , आप स्तंभ मानों को संशोधित नहीं कर सकते।
MySQL DEFAULT
. के लिए भावों का समर्थन नहीं करता है एक कॉलम का, इसलिए आप इस व्यवहार को तालिका परिभाषा में भी घोषित नहीं कर सकते हैं। *अपडेट करें:MySQL 8.0.13 DEFAULT (<expression>)
. का समर्थन करता है लेकिन अभिव्यक्ति अभी भी एक ऑटो-इन्क्रीमेंट मान पर निर्भर नहीं हो सकती है (यह दस्तावेज
)
INSERT
. करना ही एकमात्र उपाय है , और फिर तुरंत एक UPDATE
. करें group_id
को बदलने के लिए अगर यह सेट नहीं है।
INSERT INTO MyTable (group_id, value) VALUES (NULL, 'a');
UPDATE MyTable SET group_id = COALESCE(group_id, id) WHERE id = LAST_INSERT_ID();