Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL触发器插入后_Sql_Triggers_Phpmyadmin_Mariadb - Fatal编程技术网

SQL触发器插入后

SQL触发器插入后,sql,triggers,phpmyadmin,mariadb,Sql,Triggers,Phpmyadmin,Mariadb,我正在尝试在phpMyAdmin中设置触发器。有两个表,一个父表,一个子表。每次在users中创建新用户时,我想在permissions表中自动创建一行,其中包含从users生成的id作为用户id的(AI)。(permissions.id是users.id的外键) 用户: id email password -------------------------------------- 1 eric@test.com sdgsdhdfhs 2

我正在尝试在phpMyAdmin中设置触发器。有两个表,一个父表,一个子表。每次在
users
中创建新用户时,我想在
permissions
表中自动创建一行,其中包含从
users
生成的
id
作为
用户id
的(AI)。(
permissions.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
我试过(没有成功):


要访问导致执行触发器的行的数据,可以使用
NEW
OLD
别名。对于插入触发器,只有“新建”可用。对于删除触发器,只有
OLD
可用。在更新触发器中,可以同时使用这两种触发器。它们的使用方式与表别名相同(例如
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;
演示:

但是,如果您使用删除级联上的
定义外键,则不需要删除触发器

foreign key (parent_id) references parent_table(id) on delete cascade
删除父行时,所有相关的子行都将在不触发的情况下被删除


演示:

要访问导致执行触发器的行的数据,可以使用
NEW
OLD
别名。对于插入触发器,只有“新建”可用。对于删除触发器,只有
OLD
可用。在更新触发器中,可以同时使用这两种触发器。它们的使用方式与表别名相同(例如
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;
演示:

但是,如果您使用删除级联上的
定义外键,则不需要删除触发器

foreign key (parent_id) references parent_table(id) on delete cascade
删除父行时,所有相关的子行都将在不触发的情况下被删除


演示:

用您真正使用的数据库标记您的问题。您有SQL Server结构,但有一个MySQL标记。如果是MySQL,您可以使用
NEW.id
访问生成的id。@GordonLinoff-MariaDB/InnoDB@PaulSpiegel它说(在phpMyAdmin中)我的主人正在为MariaDB提供InnoDB表,但是你的方法奏效了,非常感谢!MariaDB是MySQL的分支。语法是一样的,比如99%用你真正使用的数据库标记你的问题。您有SQL Server结构,但有一个MySQL标记。如果是MySQL,您可以使用
NEW.id
访问生成的id。@GordonLinoff-MariaDB/InnoDB@PaulSpiegel它说(在phpMyAdmin中)我的主人正在为MariaDB提供InnoDB表,但是你的方法奏效了,非常感谢!MariaDB是MySQL的分支。语法与99%相同