首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL -触发器-插入前和使用SK (自动增长)

MySQL -触发器-插入前和使用SK (自动增长)
EN

Stack Overflow用户
提问于 2015-04-14 20:17:54
回答 1查看 1.1K关注 0票数 0

我在MySQL中有一个简单的posts表,其中有一个POST_ID作为SK (代理键)。对原始post ID的答复存储在PARENT_POST_ID列中的同一个表中,但我希望执行以下逻辑:

在插入(我认为.)之前

如果没有在插入中定义PARENT_POST_ID,则将行值默认为新生成的POST_ID (来自自动int序列)。

如果已在插入中定义了PARENT_POST_ID,则将其设置为传递的任何内容。

示例

代码语言:javascript
复制
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

这里的答案是:https://stackoverflow.com/a/11061766/1266457看起来可能是我需要做的事情,尽管我不知道它在做什么。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-14 20:42:00

在插入触发器之前,无法获得最后插入的主键,另一种方法是从表中获取最大值并进行增量。

这里有一种方法

代码语言:javascript
复制
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。对于第一个条目,它将为null,因此我们将其设置为1,即,在每个条目之后设置为最大post_id + 1

下面是mysql中的测试用例

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29636639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档