2017-05-06 134 views
0

我试图在phpMyAdmin中设置触发器。有两张桌子,一个父母,一个孩子。每次创建users中的新用户时,我想要在permissions表中自动创建一行,其中(AI)生成的idusersuser_id。 (permissions.user_idusers.id一个FOREIGH键)SQL触发器INSERT AFTER

用户:

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

权限:

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

我已经试过(没有成功):

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

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

用你真正使用的数据库标记你的问题。你有SQL Server结构,但是有一个MySQL标签。 –

+1

如果是MySQL,可以使用'NEW.id'来访问生成的ID。 –

+0

@GordonLinoff MariaDB/InnoDB – Rick

回答

2

要访问导致触发器执行的行的数据,可以使用NEWOLD别名。对于INSERT触发器,只有NEW可用。对于DELETE触发器,只有OLD可用。在UPDATE触发器中,你可以同时使用两者。它们的使用方式与表别名相同(例如,NEW.id/OLD.id)。

鉴于父和子表如下:

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

要插入时父行插入子行:

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

要删除所有相关的子行wehen父行被删除:

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

演示:http://rextester.com/EOW74217

不过,如果你有ON DELETE CASCADE

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

所有相关的子行会没有触发器被删除定义外键,当你删除父行删除触发器是没有必要的。

演示:http://rextester.com/CWB43482