MySQL-在一个表中插入行,然后使用自动增量ID

时间:2018-09-19 08:51:31

标签: mysql

我有2个表,分别为applicationsfilters。表的结构如下:

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.nameapplications.name相同)。当记录插入filters中时,我想获取新插入记录的主键(filters.id)(这是一个自动递增字段),并用它更新applications.filter_id我需要说明的是,applications.filter_id是我为此目的而创建的字段,目前不包含任何数据。

我是PHP开发人员,已经编写了可以执行此操作的脚本,但想知道使用纯MySQL解决方案是否可行。用伪代码,我的脚本的工作方式如下:

  1. 选择applications
  2. 中的所有记录
  3. 对(1)进行foreach循环
  4. 将记录插入filtersfilters.name == applications.name
  5. 将插入的ID(filters.id)存储到变量,然后使用变量的数据更新applications.filter_id

我不知道如何在MySQL中执行循环(2)和存储自动增量ID(4)。

我已经读过Get the new record primary key ID from mysql insert query?,因此知道LAST_INSERT_ID(),但不确定如何在每种applications记录中通过某种“循环”来引用。

请问有人可以这样做吗?

2 个答案:

答案 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`)
);