Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 插入到表2中从表1中选择,然后更新已选择/插入的表1行_Php_Mysql_Stored Procedures_Insert Update - Fatal编程技术网

Php 插入到表2中从表1中选择,然后更新已选择/插入的表1行

Php 插入到表2中从表1中选择,然后更新已选择/插入的表1行,php,mysql,stored-procedures,insert-update,Php,Mysql,Stored Procedures,Insert Update,我正在编写一个过程,将数据从一个表数据项复制到另一个表促销 数据项的表结构如下(不包括非相关字段)- 促销的表结构(不包括非相关字段) 以下是将所有行从数据\u条目复制到促销的过程,其中被复制到\u促销=0 程序 CREATE PROCEDURE `uspCopySchoolsToPromotional`(IN param_insert_datetime DATETIME) BEGIN INSERT IGNORE INTO promotional ( school_name,

我正在编写一个过程,将数据从一个表
数据项
复制到另一个表
促销
数据项的表结构如下(不包括非相关字段)-

促销的表结构
(不包括非相关字段)

以下是将所有行从
数据\u条目
复制到
促销
的过程,其中
被复制到\u促销=0

程序

CREATE PROCEDURE `uspCopySchoolsToPromotional`(IN param_insert_datetime DATETIME)
BEGIN
    INSERT IGNORE INTO promotional (
      school_name,
      mobile_number,
      email,
      website,             
      city,
      pin,
      copied_school_id                                   
    )
SELECT school_name,
    mobile_number,
    email,
    website,
    city,
    pin,
    school_id
FROM data_entry
  WHERE is_copied_to_promo =0 ;
END;
我现在要做的是将上述过程中插入/受影响的所有行的
复制到
data\u entry
表中的
promo
1
,以便每次执行上述过程时,只有
data\u entry
表中的新行应复制到promotive

我通过
PHP
code调用这个过程。解决方案可以是在同一过程中添加更新查询,也可以在执行
uspcypyschoolstopromotional
后运行另一个查询/过程

提前谢谢

编辑:


我忘了提到两个表中的学校id是不同的。促销表中的数据来自多个来源。因此,我在促销表中将
school\u id
重命名为
promo\u id
,以避免您的混淆。

如果您也复制了school\u id,则您有一个唯一的密钥可供使用,然后您可以在插入后添加一个更新来完成此操作,如:

CREATE PROCEDURE `uspCopySchoolsToPromotional`(IN param_insert_datetime DATETIME)
BEGIN
    INSERT IGNORE INTO promotional (
      school_id, 
      school_name,
      mobile_number,
      email,
      website,             
      city,
      pin                                   
    )
SELECT school_id,
    school_name,
    mobile_number,
    email,
    website,
    city,
    pin,
FROM data_entry
  WHERE is_copied_to_promo =0 ;

UPDATE data_entry 
    SET is_copied_to_promo=1 
WHERE 
    school_id=(SELECT school_id FROM promotional) 
    AND is_copies_to_promo=0;
END;

希望这有帮助:)

Mysql 8应该有公共表表达式,但它似乎没有出现在中,因此您必须使用其他机制来实现这一点。一种解决方案是使用

另一种解决方案是在插入后获取表级锁并进行更新

CREATE PROCEDURE `uspCopySchoolsToPromotional`(IN param_insert_datetime DATETIME)
BEGIN
   LOCK TABLES data_entry WRITE;
    ....


    UPDATE data_entry 
        SET is_copied_to_promo=1 
    WHERE 
        school_id=(SELECT school_id FROM promotional) 
        AND is_copies_to_promo=0;

    UNLOCK TABLES:
END;

注意,如果不锁定表,您可能会发现竞争条件会导致不一致。这两种方法(触发、锁定和更新)各有优缺点。

如果两个表中没有学校id作为自动增量,则可以按照Flauntster的查询进行操作

如果两个表中的列都是自动递增的,那么您可以按照下面的查询进行操作

CREATE PROCEDURE `uspCopySchoolsToPromotional`(IN param_insert_datetime DATETIME)
BEGIN
    INSERT IGNORE INTO promotional (
      school_id, 
      school_name,
      mobile_number,
      email,
      website,             
      city,
      pin                                   
    )
SELECT school_id,
    school_name,
    mobile_number,
    email,
    website,
    city,
    pin,
FROM data_entry
  WHERE is_copied_to_promo =0 ;

UPDATE data_entry de
JOIN promotional p ON de.school_name = p.school_name 
    AND de.mobile_number = p.mobile_number 
    AND is_copies_to_promo = 0
    SET is_copied_to_promo=1;
END;

希望这能解决您的问题。

对不起。我忘了提到两个表中的学校id是不同的。促销表中的数据来自多个来源。其中一个是
data\u entry
table。学校名称值是否唯一?如果它们是唯一的,您可以在updatewhere子句中通过以下方式进行匹配:)学校名称不唯一。但是如果我在
promotional
表中添加一个新列
copied\u school\u id
,并且
data\u entry
表的
school\u id
将插入其中。在这种情况下,你可能会有所帮助。去试试触发选项,让你知道。
CREATE TRIGGER data_entry  AFTER INSERT ON promotional_update
FOR EACH ROW
BEGIN
   UPDATE data_entry SET 
      WHERE is_copied_to_promo = 1 WHERE school_id = new.ID;
END
CREATE PROCEDURE `uspCopySchoolsToPromotional`(IN param_insert_datetime DATETIME)
BEGIN
   LOCK TABLES data_entry WRITE;
    ....


    UPDATE data_entry 
        SET is_copied_to_promo=1 
    WHERE 
        school_id=(SELECT school_id FROM promotional) 
        AND is_copies_to_promo=0;

    UNLOCK TABLES:
END;
CREATE PROCEDURE `uspCopySchoolsToPromotional`(IN param_insert_datetime DATETIME)
BEGIN
    INSERT IGNORE INTO promotional (
      school_id, 
      school_name,
      mobile_number,
      email,
      website,             
      city,
      pin                                   
    )
SELECT school_id,
    school_name,
    mobile_number,
    email,
    website,
    city,
    pin,
FROM data_entry
  WHERE is_copied_to_promo =0 ;

UPDATE data_entry de
JOIN promotional p ON de.school_name = p.school_name 
    AND de.mobile_number = p.mobile_number 
    AND is_copies_to_promo = 0
    SET is_copied_to_promo=1;
END;