【问题标题】:Insert from one table to another从一个表插入到另一个表
【发布时间】:2014-10-03 12:42:20
【问题描述】:

我目前正在处理一个 PHP/MySQL 项目,并且陷入了一个复杂的(或至少对我而言)插入函数。

此处适用的 3 个表格是

客户 此处相关的字段是 clientpk(AI 主键)和 clientscope。

模板文档 , 相关的字段有templatepk, doctype, doctitle, templatescope

客户文档 与docpk、doctype、doctitle相关的字段

我想要做的是在客户表中添加一条新记录后有一个代码,它将模板文档表中的记录插入到 client.clientscope = templatedocuments.templatescope 的 clientdocuments 表中,我怀疑这将是一个 foreach 函数.

我只使用过从一个表插入到另一个表的插入查询,而不是使用 3 个表的地方。

如果有人能给我一个基本的想法,那么我应该能够弄清楚其余的,谢谢。

更新:我在这里苦苦挣扎的是说 ClientTable 是表 A,TemplateDocuments 是表 B,ClientDocuments 是表C。当我从表 A 中编写插入函数时,我知道如何将表 A 中的记录插入表 C。但是我不知道如何将表 B(本质上是一个不相关的资源表)数据插入表 C,使用表 B 中的当前变量。

具体来说,表 B 现在有 147 条不同的记录,每个表 C 中只有 50 条记录,因为存在变体,过滤的是 client.clientscope 和 templatedocuments.template 范围要插入的相关记录。

【问题讨论】:

  • 考虑使用after insert trigger

标签: php mysql insert


【解决方案1】:

您可以在insert.. select 语法中使用joins:

INSERT INTO clientdocuments (doctype, doctitle)
SELECT doctype, doctitle
FROM   templatedocuments t
JOIN   client c ON t.templatescope = c.clientscope
WHERE  client.clientpk = 123

【讨论】:

  • 是的,这很有意义并且很接近,我如何将它与 Foreach 函数结合起来?
  • 你为什么想要一个 foreach 函数?只需通过更改clientpk 上的条件将所有缺少的项目插入到单个语句中。
  • 好的,这样行吗? $sql = "INSERT INTO documents_doucments (companyfk, doctype, doctitle) values ('".$values["companypk"]."', doctype, templatename) FROM templates_documents WHERE global_companies.msscope = templates_documents.scope)";CustomQuery($ sql);
  • 谢谢,会告诉你的,不知道你可以使用 FROM 语句
  • @user3169979 等一下,看错了 - 你错过了 select: INSERT INTO documents_doucments (companyfk, doctype, doctitle) SELECT '".$values["companypk"]."', doctype, templatename FROM templates_documents WHERE global_companies.msscope = templates_documents.scope)"
【解决方案2】:

你可以在 mysql 端使用触发器链接这个:

DELIMITER $$

USE `databaseName`$$

DROP TRIGGER /*!50032 IF EXISTS */ `trigger_TableName`$$

CREATE

TRIGGER `trigger_Templatedocs` AFTER UPDATE ON `Client` 
FOR EACH ROW BEGIN
IF NEW.field <> OLD.field THEN
    INSERT INTO Templatedocs (fieldName, fieldName2) VALUES (NEW.field, NEW.field);
END IF;
END;
$$

DELIMITER ;

我不确定它是否适合你,但你可以试试这个。

【讨论】:

    【解决方案3】:

    您可以在client 表上使用AFTER INSERT 触发器来完成它;像下面的东西

    DELIMITER $$
    create trigger trg_insert_clientdocs
    after insert on Client
    for each row 
    begin
    INSERT INTO ClientDocs(doctype, doctitle)
    select td.doctype, td.doctitle
    from Templatedocs td
    where td.templatescope = new.clientscope;
    END$$
    DELIMITER ;
    

    以上触发代码将根据templatescope 列上的匹配从Templatedocs 表向ClientDocs 表插入记录;其中templatescope 列的值与Clientclientscope 列中新插入的值相同。

    【讨论】:

      猜你喜欢
      • 2014-07-29
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      相关资源
      最近更新 更多