SQL 触发器 INSERT AFTER
Posted
技术标签:
【中文标题】SQL 触发器 INSERT AFTER【英文标题】:SQL trigger INSERT AFTER 【发布时间】:2017-10-04 22:59:19 【问题描述】:我正在尝试在 phpMyAdmin 中设置触发器。有两张桌子,一个父母,一个孩子。每次在users
中创建新用户时,我想自动在permissions
表中创建一行,其中(AI)从users
生成id
作为user_id
。 (permissions.user_id
是users.id
的外键)
用户:
id email password
--------------------------------------
1 eric@test.com sdgsdhdfhs
2 john@test.com dfgsdgdfhg
3 mary@test.com 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)
【问题讨论】:
用您真正使用的数据库标记您的问题。您有 SQL Server 构造,但有一个 mysql 标记。 如果是MySQL,可以使用NEW.id
访问生成的id。
@GordonLinoff MariaDB / InnoDB
@PaulSpiegel 它说(在 phpMyAdmin 中)我的主机正在为 MariaDB 提供 InnoDB 表,但是您的方法有效,非常感谢!
MariaDB 是 MySQL 的分支。 99%的语法是一样的
【参考方案1】:
要访问导致执行触发器的行的数据,您可以使用NEW
和OLD
别名。对于 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);
在删除父行时删除所有相关子行:
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
【讨论】:
以上是关于SQL 触发器 INSERT AFTER的主要内容,如果未能解决你的问题,请参考以下文章
SQL SERVER 中,after insert触发器是啥意思,应该如何使用?
SQL Server“AFTER INSERT”触发器看不到刚刚插入的行