我有2个表,分别为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
循环filters
(filters.name
== applications.name
)filters.id
)存储到变量,然后使用变量的数据更新applications.filter_id
。我不知道如何在MySQL中执行循环(2)和存储自动增量ID(4)。
我已经读过Get the new record primary key ID from mysql insert query?,因此知道LAST_INSERT_ID()
,但不确定如何在每种applications
记录中通过某种“循环”来引用。
请问有人可以这样做吗?
答案 0 :(得分:0)
我认为仅向mysql发送一个请求就不可能做到这一点。
但是,我认为这是mysql触发器的好用例。
我认为您应该这样写:
CREATE TRIGGER after_insert_create_application_filter AFTER INSERT
ON applications FOR EACH ROW
BEGIN
INSERT INTO filters (name) VALUES (NEW.name);
UPDATE applications SET filter_id = LAST_INSERT_ID() WHERE id = NEW.id;
END
此触发器未经测试,但您应该了解其编写方式。
如果您不了解mysql触发器,则可以阅读this part of the documentation。
答案 1 :(得分:0)
这不是您的问题的答案,更不是对数据库设计的评论。
首先,如果name
字段需要包含相同的信息,则它们应该具有相同的类型和大小(varchar(255)
)
总的来说,我认为您用于表的架构是错误的。您的描述说applications
中的每条记录只能容纳一个filter_id
。如果是这样,那么使用两个单独的表就没有意义了。
如果有可能存在多对一关系,请通过相关的主键链接记录。如果application
中的多个记录可以与一个过滤器相关,请将filters.id
存储在applications
表中。如果单个应用程序有多个过滤器,请将applications.id
存储在filters
表中。
如果存在多对多关系,则创建另一个表来存储它:
CREATE TABLE `application_filters_mappings` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`application_id` int(10) unsigned NOT NULL,
`filters_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
);