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_idusers.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】:

要访问导致执行触发器的行的数据,您可以使用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);

在删除父行时删除所有相关子行:

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”触发器看不到刚刚插入的行

SQL Server - 在模式中触发AFTER INSERT表

在 AFTER INSERT 触发器中删除表

触发器before和after有啥区别?

SQLServer之创建DML AFTER INSERT触发器