2010-05-25 9 views
11

मैं किसी समस्या में भाग गया क्योंकि मैंने अपने डेटाबेस में दो TIMESTAMP कॉलम बनाने का प्रयास किया था। एक को created कहा जाता है और जिसे updated कहा जाता है। मुझे लगता है कि updated कॉलम के लिए CURRENT_TIMESTAMP और फिर ON UPDATE CURRENT_TIMESTAMP दोनों के डिफ़ॉल्ट मान को सेट करना आसान होगा। लेकिन किसी कारण से MySQL का अर्थ है कि यह एक बुरा विचार है ... इसलिए मैं इसे सम्मिलित क्वेरी में से किसी एक को सेट किए बिना ऐसा करने के तरीकों की तलाश कर रहा हूं।MySQL: नई पंक्तियों के लिए निर्माण दिनांक सेट करने के लिए ट्रिगर कैसे बनाएं

मुझे this answer में ट्रिगर का उपयोग करके एक तरीका मिला, लेकिन मुझे त्रुटियां मिल रही हैं। मैं सिर्फ वास्तव में ट्रिगर बनाना करने में कामयाब रहे, लेकिन अब मैं त्रुटियों मिल जब मैं नई पंक्तियों का दावा है कि

1442 को सम्मिलित करने की कोशिश - टेबल संग्रहीत समारोह में 'कार्य' अपडेट नहीं कर सकते/ट्रिगर क्योंकि यह पहले से ही प्रयोग किया जाता है कथन जिसने इस संग्रहीत कार्य/ट्रिगर को बुलाया।

और मुझे इसका अर्थ यह नहीं मिलता है। तो, मैं उम्मीद कर रहा था कि यहां कोई व्यक्ति इस विषय को कुछ प्रकाश डाल सकता है।

एसक्यूएल मैं तालिका बनाने के लिए इस्तेमाल किया और ट्रिगर इस प्रकार है:

CREATE TABLE `tasks` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `created` DATETIME, 
    `updated` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `title` VARCHAR(255) NOT NULL, 
    `notes` TEXT, 
    `status_id` INT(10) UNSIGNED NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `status_id` (`status_id`), 
    CONSTRAINT `fk_tasks_statuses` FOREIGN KEY (`status_id`) REFERENCES `statuses` (`id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TRIGGER task_creation_timestamp AFTER INSERT ON tasks 
FOR EACH ROW 
UPDATE tasks SET created = updated WHERE id = NEW.id; 

क्या मैं गलत यहाँ कर रहा हूँ?

उत्तर

24

आपका ट्रिगर "डालने से पहले" होने की जरूरत है, और आप SET बजाय UPDATE उपयोग करने की आवश्यकता:

CREATE TRIGGER task_creation_timestamp BEFORE INSERT ON tasks 
FOR EACH ROW 
SET NEW.created = NOW(); 
संबंधित मुद्दे