我有两张table叫 applications
以及 filters
. 表的结构如下:
mysql> DESCRIBE applications;
+-----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------------+------+-----+---------+----------------+
| id | tinyint(3) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| filter_id | int(3) | NO | | NULL | |
+-----------+---------------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
mysql> DESCRIBE filters;
+----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(100) | NO | | NULL | |
| label | varchar(255) | NO | | NULL | |
| link | varchar(255) | NO | | NULL | |
| anchor | varchar(100) | NO | | NULL | |
| group_id | tinyint(3) unsigned | NO | MUL | NULL | |
| comment | varchar(255) | NO | | NULL | |
+----------+----------------------+------+-----+---------+----------------+
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
记录。
如果可能的话,有人能告诉我吗?
2条答案
按热度按时间nnsrf1az1#
这不是对您的问题的回答,而是对您的数据库设计的评论。
首先,如果
name
字段需要包含相同的信息,它们的类型和大小应该相同(varchar(255)
)总的来说,我认为您用于表的模式是错误的。你的描述说
applications
只能容纳一个filter_id
. 如果是这样的话,那么使用两个单独的表是没有意义的。如果可能存在多对一关系,请通过相关主键链接记录。如果有多条记录
application
可以关联到单个筛选器、存储filters.id
在applications
table。如果单个应用程序有多个筛选器,请存储applications.id
在filters
table。如果存在多对多关系,请创建另一个表来存储它:
uyhoqukh2#
我不认为只有一个对mysql的请求就可以做到这一点。
但是,我认为这是mysql触发器的一个很好的用例。
我觉得你应该这样写:
这个触发器没有经过测试,但是您应该了解如何编写它。
如果您不知道mysql触发器,可以阅读这部分文档。