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;