2017-05-06 2 views
0

Ich versuche, einen Trigger in phpMyAdmin einzurichten. habe zwei Tische, einen Elternteil, ein Kind. Jedes Mal, wenn ein neuer Benutzer in users erstellt wird, möchte ich automatisch eine Zeile in der Tabelle permissions mit dem (AI) id generiert von users als user_id erstellen. (permissions.user_id ist ein foreigh Schlüssel users.id)SQL-Trigger INSERT NACH

Benutzer:

id email    password 
-------------------------------------- 
1  [email protected]  sdgsdhdfhs 
2  [email protected]  dfgsdgdfhg 
3  [email protected]  plkdfjvjvv 

Berechtigungen:

index user_id  allow_read allow_write allow_delete 
------------------------------------------------------------- 
1  1   1   0    1 
2  2   1   1    1 
3  3   0   0    0 

Ich habe versucht (ohne Erfolg):

INSERT 
INTO permissions 
(user_id) 
VALUES 
(IDENT_CURRENT('users')) 

und

INSERT 
INTO permissions 
(user_id) 
VALUES 
(@@IDENTITY) 
+0

Tag Ihre Frage mit der Datenbank, die Sie wirklich verwenden. Sie haben SQL Server-Konstrukte aber ein MySQL-Tag. –

+1

Wenn es MySQL ist, können Sie 'NEW.id' verwenden, um auf die generierte ID zuzugreifen. –

+0

@GordonLinoff MariaDB/InnoDB – Rick

Antwort

2

Um auf die Daten der Zeile zuzugreifen, die die Ausführung eines Triggers verursacht hat, können Sie NEW und OLD Aliase verwenden. Für INSERT-Trigger steht nur NEW zur Verfügung. Für DELETE-Trigger steht nur OLD zur Verfügung. In UPDATE-Triggern können Sie beide verwenden. Sie werden auf die gleiche Weise wie Tabellenaliase verwendet (z. B. NEW.id/OLD.id).

ein Elternteil und ein Kind Tabelle wie folgt:

create table parent_table(
    id int auto_increment primary key, 
    pdata varchar(50) 
); 
create table child_table(
    id int auto_increment primary key, 
    parent_id int not null, 
    cdata varchar(50) default '', 
    foreign key (parent_id) references parent_table(id) 
); 

ein Kind Zeile einzufügen, wenn eine übergeordnete Zeile eingefügt:

create trigger insert_parent 
    after insert on parent_table 
    for each row 
     insert into child_table(parent_id) 
     values (new.id); 

alle Zeilen verwandten Kind So löschen Sie eine übergeordnete Zeile die Coolness gestrichen:

create trigger delete_parent 
    before delete on parent_table 
    for each row 
     delete from child_table 
     where parent_id = old.id; 

Demo: http://rextester.com/EOW74217

jedoch ein DELETE-Trigger ist nicht erforderlich, wenn Sie mit ON DELETE CASCADE

foreign key (parent_id) references parent_table(id) on delete cascade 

Alle verwandten Kind Reihen Ihre Fremdschlüssel definieren, ohne einen Trigger gelöscht werden, wenn Sie die übergeordnete Zeile löschen.

Demo: http://rextester.com/CWB43482