2014-06-25 18 views
7

kullanıcıları tablosu:MYSQL'de Auto-Increment değerini kullanma Trigger Ekleme'den Önce?

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 tablosu:

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; 

kullanıcıları masaya ekleme tetik önce:

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 

Temelde, benim sorunum burada tetikte olduğunu otomatik olarak MySQL (PK, NN, Auto-Increment) tarafından atanan kullanıcının kimliğini koymaya çalıştığımda, sadece user_records sekmesinde le. Nasıl yapmalıyım ki, kullanıcı SQL tarafından atanan kimliği seçip, kayıt girişinde (ID '' OLDUĞUNDAN sonra ID'nin olduğu yer) userid olarak yerleştirecektir? Eğer masalarda yapılmış olabilir başka optimizasyonlar görürseniz

Ayrıca, bana bildirin çekinmeyin: yerine before insert ait after insert için

cevap

11

OP'ın comment:
Daha önce yapacağını nasıl sen?

Yeni kayda atanacak olan cari auto_increment değerini bulabilirsiniz.
user_records tablosu için aynı kullanıcı before tetikleyicide bir üst kullanıcı kimliği olarak kullanın.
Değeri bulmak için information_schema.tables çizelgesini sorgulamalısınız.

Örnek:

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

Teşekkür ederiz! Çok sevinirim ama daha fazla temsilciye ihtiyacım var! –

+0

Çözüm sağladığınız için teşekkür ederiz –

1

değiştirin D tetiği ve son eklenen kimliği almak için NEW kullanmak

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

Nasıl daha önce yapacağını, sen? –

+0

Eklemeden önce bir anlam ifade etmiyor, ekleme gerçekleştiğinde, yalnızca kullanıcı tablosundan iduser alacaksınız. Eğer ekleme yapmadan önce yaparsanız, o zaman kullanıcı masasından birer birer artan son kimliği seçip masanın üzerine ekleyiniz ve bunu yapmak için uygun bir yol değil. Girmeden önce, gelen verileri kontrol ettiğinizde ve ardından yerleştirmeden önce koşullara göre bazı değerleri değiştirdiğinizde en iyisi olur. –

+2

@AbhikChakraborty: Hayır, değerdeki manuel artış için gerekli değildir. Atanan bir sonraki auto_increment değerini okuyarak bunu başarabilirsiniz. Cevabımı kontrol et. –

İlgili konular