MySQL - 触发器 - 在插入和使用 SK(自动增量)之前
MySQL - Trigger - Before Insert and using the SK (Auto Increment)
我在 MySQL 中有一个简单的 posts table,它有一个 POST_ID 作为 SK(代理键)。
对原始post ID 的回复存储在同一table 中的一个PARENT_POST_ID 列中,但我想执行以下逻辑:
插入之前(我认为...)
如果 PARENT_POST_ID 尚未在 INSERT 上定义,则将行值默认为新生成的 POST_ID(来自自动整数序列)
如果在 INSERT 上定义了 PARENT_POST_ID ,则将其设置为已传递的值。
例子
post_id | parent_post_id | date_time | message
12 12 2015-04-14 21:10 A new post (start of a thread)
13 12 2015-04-14 21:12 A reply to the post ID 12
这里的答案: 看起来这可能是我需要做的,虽然我不确定它在做什么。
谢谢。
因为在插入触发器之前你无法获取最后插入的主键,另一种方法是从 table 中获取最大值并递增它。
这是一种方法
delimiter //
create trigger posts_before_ins before insert on posts
for each row
begin
declare last_id int;
if new.parent_post_id is null then
select max(post_id) into last_id from posts ;
if last_id is null then
set new.parent_post_id = 1 ;
else
set new.parent_post_id = last_id+1 ;
end if ;
end if ;
end ;//
delimiter ;
因此触发器将检查插入查询中是否没有 parent_post_id
的值,它将获得最大值 post_id
。对于第一个条目,它将为空,因此我们将其设置为 1,即在每个条目之后最大 post_id + 1
。
这是 mysql
中的一个测试用例
mysql> select * from test ;
Empty set (0.00 sec)
mysql> delimiter //
mysql> create trigger test_is before insert on test
-> for each row
-> begin
-> declare last_id int;
-> if new.parent_id is null then
-> SELECT auto_increment into last_id
-> FROM INFORMATION_SCHEMA.TABLES WHERE table_name = 'test'
-> and TABLE_SCHEMA = 'test';
-> set new.parent_id = last_id ;
-> end if ;
-> end ;//
Query OK, 0 rows affected (0.12 sec)
mysql>
mysql> delimiter ;
mysql> insert into test (val) values ('aa');
Query OK, 1 row affected (0.10 sec)
mysql> insert into test (val) values ('bb');
Query OK, 1 row affected (0.04 sec)
mysql> select * from test ;
+---------+-----------+------+
| post_id | parent_id | val |
+---------+-----------+------+
| 1 | 1 | aa |
| 2 | 2 | bb |
+---------+-----------+------+
2 rows in set (0.00 sec)
我在 MySQL 中有一个简单的 posts table,它有一个 POST_ID 作为 SK(代理键)。 对原始post ID 的回复存储在同一table 中的一个PARENT_POST_ID 列中,但我想执行以下逻辑:
插入之前(我认为...)
如果 PARENT_POST_ID 尚未在 INSERT 上定义,则将行值默认为新生成的 POST_ID(来自自动整数序列)
如果在 INSERT 上定义了 PARENT_POST_ID ,则将其设置为已传递的值。
例子
post_id | parent_post_id | date_time | message
12 12 2015-04-14 21:10 A new post (start of a thread)
13 12 2015-04-14 21:12 A reply to the post ID 12
这里的答案: 看起来这可能是我需要做的,虽然我不确定它在做什么。
谢谢。
因为在插入触发器之前你无法获取最后插入的主键,另一种方法是从 table 中获取最大值并递增它。
这是一种方法
delimiter //
create trigger posts_before_ins before insert on posts
for each row
begin
declare last_id int;
if new.parent_post_id is null then
select max(post_id) into last_id from posts ;
if last_id is null then
set new.parent_post_id = 1 ;
else
set new.parent_post_id = last_id+1 ;
end if ;
end if ;
end ;//
delimiter ;
因此触发器将检查插入查询中是否没有 parent_post_id
的值,它将获得最大值 post_id
。对于第一个条目,它将为空,因此我们将其设置为 1,即在每个条目之后最大 post_id + 1
。
这是 mysql
中的一个测试用例mysql> select * from test ;
Empty set (0.00 sec)
mysql> delimiter //
mysql> create trigger test_is before insert on test
-> for each row
-> begin
-> declare last_id int;
-> if new.parent_id is null then
-> SELECT auto_increment into last_id
-> FROM INFORMATION_SCHEMA.TABLES WHERE table_name = 'test'
-> and TABLE_SCHEMA = 'test';
-> set new.parent_id = last_id ;
-> end if ;
-> end ;//
Query OK, 0 rows affected (0.12 sec)
mysql>
mysql> delimiter ;
mysql> insert into test (val) values ('aa');
Query OK, 1 row affected (0.10 sec)
mysql> insert into test (val) values ('bb');
Query OK, 1 row affected (0.04 sec)
mysql> select * from test ;
+---------+-----------+------+
| post_id | parent_id | val |
+---------+-----------+------+
| 1 | 1 | aa |
| 2 | 2 | bb |
+---------+-----------+------+
2 rows in set (0.00 sec)