2014-06-25 17 views
7

tabela użytkownicy:Używanie wartości Auto-inkrementacji w MYSQL przed wstawieniem spustu?

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; 

tabela 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; 

przed wkładki wyzwalacz na tabeli użytkowników:

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 

Zasadniczo mój problem polega na tym, że na spuście kiedy próbuję wprowadzić identyfikator użytkownika, który jest automatycznie przypisywany przez MySQL (PK, NN, Auto-inkrementacja), po prostu wpisuje 0 dla identyfikatora użytkownika na zakładce user_records le. Jak to zrobić, aby wybrał identyfikator, do którego użytkownik jest przypisany przez SQL, i wstawił go jako identyfikator użytkownika do wpisu rekordów (gdzie ID jest zaraz po "CREATED")?

Ponadto, jeśli widzisz jakieś inne optymalizacje, które mogłyby zostać wprowadzone na stołach, nie krępuj się daj mi znać: D

Odpowiedz

11

OP:
Jak to zrobić przed, ty?

Możesz znaleźć aktualną wartość auto_increment, która ma zostać przypisana do nowego rekordu.
Użyj tego samego w wyzwalaczu before jako identyfikatora użytkownika nadrzędnego dla tabeli user_records.
Musisz wyszukać tabelę, aby znaleźć wartość.

Przykład:

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

Dziękujemy! Chciałbym przegłosować, ale potrzebuję więcej rep! –

+0

Dziękujemy za dostarczenie rozwiązania –

1

Zmienić spust after insert zamiast before insert i używać NEW dostać ostatni zapisany identyfikator

komentarz
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

Jak to zrobić przed, ty? –

+0

Z przed wstawieniem nie ma sensu, po wstawieniu dzieje się tylko ty dostaniesz iduser z tabeli użytkownika. Jeśli używasz przed wstawieniem, musisz wybrać ostatni identyfikator z tabeli użytkownika, zwiększając go o jeden, a następnie wstaw do tabeli i nie jest to właściwy sposób. Przed wstawieniem najlepiej jest sprawdzać przychodzące dane, a następnie zmienić niektóre wartości na podstawie warunków przed ich wstawieniem. –

+2

@AbhikChakraborty: Nie, nie jest konieczne ręczne zwiększanie wartości. Można to osiągnąć, odczytując następną dostępną wartość auto_increment do przypisania. Sprawdź moją odpowiedź. –

Powiązane problemy