2014-06-25 6 views
7

उपयोगकर्ताओं तालिका:ट्रिगर डालने से पहले MYSQL में ऑटो-वृद्धि मूल्य का उपयोग करना?

CREATE TABLE `users` (
    `id` int(8) unsigned NOT NULL AUTO_INCREMENT, 
    `email` varchar(45) DEFAULT NULL, 
    `username` varchar(16) DEFAULT NULL, 
    `salt` varchar(16) DEFAULT NULL, 
    `password` varchar(128) DEFAULT NULL, 
    `lastlogin` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `joined` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `loggedin` tinyint(1) unsigned NOT NULL DEFAULT '0', 
    `sessionkey` varchar(60) DEFAULT NULL, 
    `verifycode` varchar(16) DEFAULT NULL, 
    `verified` tinyint(1) unsigned NOT NULL DEFAULT '0', 
    `banned` tinyint(1) unsigned NOT NULL DEFAULT '0', 
    `locked` tinyint(1) unsigned NOT NULL DEFAULT '0', 
    `ip_address` varchar(45) DEFAULT NULL, 
    `failedattempts` tinyint(1) unsigned NOT NULL DEFAULT '0', 
    `unlocktime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1; 

user_records तालिका:

CREATE TABLE `user_records` (
    `id` int(8) unsigned NOT NULL AUTO_INCREMENT, 
    `userid` int(8) unsigned DEFAULT NULL, 
    `action` varchar(100) DEFAULT NULL, 
    `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1; 

उपयोगकर्ताओं मेज पर डालने ट्रिगर से पहले:

USE `gknet`; 
DELIMITER $$ 
CREATE DEFINER=`root`@`localhost` TRIGGER `before_create_user` BEFORE INSERT ON `users` FOR EACH ROW BEGIN 
INSERT INTO user_records (action, userid, timestamp) 
    VALUES ('CREATED', ID, NOW()); 
END 

असल में, मेरी समस्या है कि यहाँ है ट्रिगर पर जब मैं उस उपयोगकर्ता की आईडी डालने का प्रयास करता हूं जो स्वचालित रूप से MySQL (पीके, एनएन, ऑटो-एन्हांसमेंट) द्वारा असाइन किया गया है, तो यह user_records टैब पर उपयोगकर्ता आईडी के लिए 0 डालता है le। मैं इसे कैसे करूँगा, इसलिए यह आईडी का चयन करेगा कि उपयोगकर्ता को एसक्यूएल द्वारा असाइन किया जा रहा है, और इसे रिकॉर्ड एंट्री पर उपयोगकर्ता आईडी के रूप में रखा गया है (जहां आईडी 'CREATED' के बाद सही है)?

इसके अलावा, अगर आप किसी भी अन्य अनुकूलन नहीं है जो टेबल पर बनाया जा सकता है देखते हैं, मुझे पता है के लिए स्वतंत्र महसूस: before insert के बजाय after insert के लिए डी

उत्तर

11

ओपी की टिप्पणी:
मैं इसे पहले करना होगा कैसे, तू?

आप वर्तमान auto_increment मान को एक नए रिकॉर्ड में सौंपा जा सकता है।
और में user_records तालिका के लिए मूल उपयोगकर्ता आईडी के रूप में ट्रिगर का उपयोग करें।
मूल्य खोजने के लिए आपको information_schema.tables तालिका से पूछना होगा।

उदाहरण:

use `gknet`; 

delimiter $$ 

drop trigger if exists before_create_user; $$ 

create definer=`root`@`localhost` trigger `before_create_user` 
     before insert on `users` 
for each row begin 
    declare fk_parent_user_id int default 0; 

    select auto_increment into fk_parent_user_id 
    from information_schema.tables 
    where table_name = 'users' 
    and table_schema = database(); 

    insert into user_records (action, userid, timestamp) 
     values ('created', fk_parent_user_id, now()); 
end; 

$$ 

delimiter ; 
+0

धन्यवाद! मैं ऊपर हट जाऊंगा लेकिन मुझे और प्रतिनिधि की जरूरत है! –

+0

समाधान प्रदान करने के लिए धन्यवाद –

1

बदलें ट्रिगर और NEW का उपयोग पिछले डाला आईडी प्राप्त करने के लिए

USE `gknet`; 
DELIMITER $$ 
CREATE DEFINER=`root`@`localhost` 
TRIGGER `after_create_user` AFTER INSERT ON `users` 
FOR EACH ROW 
BEGIN 
INSERT INTO user_records (action, userid, timestamp) 
    VALUES ('CREATED', NEW.ID, NOW()); 
END; $$ 
+0

कैसे मैं इसे पहले करना होगा, तू? –

+0

डालने से पहले यह समझ में नहीं आता है, एक बार सम्मिलित होने के बाद ही आपको उपयोगकर्ता तालिका से iduser मिल जाएगा। यदि आप पहले डालने के साथ करते हैं तो आपको उपयोगकर्ता तालिका से अंतिम आईडी को एक करके बढ़ाकर और फिर टेबल पर डालना होगा और यह करने का उचित तरीका नहीं है। सम्मिलित करने से पहले आने वाले डेटा की जांच करने के लिए सबसे अच्छा है और फिर इसे सम्मिलित करने से पहले स्थिति के आधार पर कुछ मानों को बदलें। –

+2

@AikikChakraborty: नहीं, मूल्य पर मैन्युअल वृद्धि के लिए यह आवश्यक नहीं है। आप असाइन किए जाने के लिए अगले उपलब्ध auto_increment मान को पढ़कर इसे प्राप्त कर सकते हैं। मेरा जवाब जांचें। –

संबंधित मुद्दे