在一个表中插入行,然后用自动增量id更新另一个表

2w2cym1i  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(325)

我有两张table叫 applications 以及 filters . 表的结构如下:

  1. mysql> DESCRIBE applications;
  2. +-----------+---------------------+------+-----+---------+----------------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +-----------+---------------------+------+-----+---------+----------------+
  5. | id | tinyint(3) unsigned | NO | PRI | NULL | auto_increment |
  6. | name | varchar(255) | NO | | NULL | |
  7. | filter_id | int(3) | NO | | NULL | |
  8. +-----------+---------------------+------+-----+---------+----------------+
  9. 3 rows in set (0.01 sec)
  10. mysql> DESCRIBE filters;
  11. +----------+----------------------+------+-----+---------+----------------+
  12. | Field | Type | Null | Key | Default | Extra |
  13. +----------+----------------------+------+-----+---------+----------------+
  14. | id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
  15. | name | varchar(100) | NO | | NULL | |
  16. | label | varchar(255) | NO | | NULL | |
  17. | link | varchar(255) | NO | | NULL | |
  18. | anchor | varchar(100) | NO | | NULL | |
  19. | group_id | tinyint(3) unsigned | NO | MUL | NULL | |
  20. | comment | varchar(255) | NO | | NULL | |
  21. +----------+----------------------+------+-----+---------+----------------+
  22. 7 rows in set (0.02 sec)

我要做的是选择中的所有记录 applications 并在 filters (因此 filters.name 与相同 applications.name ). 当记录插入 filters 我想要主键( filters.id )新插入的记录(这是一个自动递增字段)的 applications.filter_id 用它。我应该澄清一下 applications.filter_id 是我为此目的创建的字段,目前不包含任何数据。
我是一个php开发人员,已经编写了一个脚本,可以做到这一点,但想知道是否有可能与纯mysql解决方案。在伪代码中,我的脚本的工作方式如下:
选择中的所有记录 applications 做一个 foreach 循环开启(1)
在中插入记录 filters ( filters.name == applications.name )
存储插入的id( filters.id )然后更新 applications.filter_id 变量的数据。
我不知道如何在mysql中执行循环(2)和存储自动增量id(4)。
我读过关于从mysql insert query获取新记录主键id的内容?所以我知道 LAST_INSERT_ID() 但不知道如何在某种“循环”中引用它,这种循环通过每个 applications 记录。
如果可能的话,有人能告诉我吗?

nnsrf1az

nnsrf1az1#

这不是对您的问题的回答,而是对您的数据库设计的评论。
首先,如果 name 字段需要包含相同的信息,它们的类型和大小应该相同( varchar(255) )
总的来说,我认为您用于表的模式是错误的。你的描述说 applications 只能容纳一个 filter_id . 如果是这样的话,那么使用两个单独的表是没有意义的。
如果可能存在多对一关系,请通过相关主键链接记录。如果有多条记录 application 可以关联到单个筛选器、存储 filters.idapplications table。如果单个应用程序有多个筛选器,请存储 applications.idfilters table。
如果存在多对多关系,请创建另一个表来存储它:

  1. CREATE TABLE `application_filters_mappings` (
  2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  3. `application_id` int(10) unsigned NOT NULL,
  4. `filters_id` int(10) unsigned NOT NULL,
  5. PRIMARY KEY (`id`)
  6. );
uyhoqukh

uyhoqukh2#

我不认为只有一个对mysql的请求就可以做到这一点。
但是,我认为这是mysql触发器的一个很好的用例。
我觉得你应该这样写:

  1. CREATE TRIGGER after_insert_create_application_filter AFTER INSERT
  2. ON applications FOR EACH ROW
  3. BEGIN
  4. INSERT INTO filters (name) VALUES (NEW.name);
  5. UPDATE applications SET filter_id = LAST_INSERT_ID() WHERE id = NEW.id;
  6. END

这个触发器没有经过测试,但是您应该了解如何编写它。
如果您不知道mysql触发器,可以阅读这部分文档。

相关问题