INSERT INTO table2 SELECT FROM table1 然后更新 table1 行 selected/inserted
INSERT INTO table2 SELECT FROM table1 then UPDATE table1 rows that selected/inserted
我正在编写一个程序,将数据从 table data_entry
复制到另一个 table promotional
Table data_entry
的结构如下(排除无关字段)-
CREATE TABLE `data_entry` (
`school_id` int(11) NOT NULL AUTO_INCREMENT,
`school_name` varchar(255) NOT NULL,
`mobile_number` varchar(15) DEFAULT NULL,
`email` varchar(50) DEFAULT NULL,
`website` varchar(255) DEFAULT NULL,
`city` varchar(250) DEFAULT NULL,
`pin` varchar(6) DEFAULT NULL,
`is_copied_to_promo` tinyint(4) DEFAULT '0'
PRIMARY KEY (`school_id`)
)
Table promotional
的结构(不包括非相关字段)
CREATE TABLE `promotional` (
`promo_id` int(11) NOT NULL AUTO_INCREMENT, //renamed to avoid confusion
`school_name` varchar(255) NOT NULL,
`mobile_number` varchar(15) DEFAULT NULL,
`email` varchar(50) DEFAULT NULL,
`website` varchar(255) DEFAULT NULL,
`city` varchar(250) DEFAULT NULL,
`pin` varchar(6) DEFAULT NULL,
`copied_school_id` INT, // edit - school_id of data_entry table will go here
PRIMARY KEY (`promo_id`)
)
这是将所有行从 data_entry
复制到 promotional
的过程,其中 is_copied_to_promo=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_entry
table 中所有 inserted/affected 行的 is_copied_to_promo
更新为 1
,以便每个我执行上述过程时,只有来自 data_entry
table 的新行应该复制到 promotional.
我正在通过 PHP
代码调用此过程。解决方案可以是在同一过程中添加更新查询,或者在执行 uspCopySchoolsToPromotional
.
之后添加 运行 另一个 query/procedue
提前致谢。
编辑:
我忘了提到两个 table 中的 school_id 是不同的。在促销 table 中,数据来自多个来源。所以我在促销 table 中将 school_id
重命名为 promo_id
以避免您混淆。
如果你也复制了 school_id 那么你就有了一个唯一的密钥可以使用,然后你可以在 INSERT 之后添加一个 UPDATE 来做到这一点,比如:
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 应该有常见的 Table 表达式,但它似乎没有出现在 release announcements, so you will have to use some other mechanism to implement this. One solution is to use an after insert trigger
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
另一种解决方案是在插入
之后采取table级别的锁和更新
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;
请注意,如果您不锁定 table,您可能会发现竞争条件会导致不一致。这两种方法(触发 vs 锁定和更新)各有利弊。
如果您在两个表中都没有 School_id 作为 auto_increment,您可以按照 Flauntster 的查询。
如果两个表中的列都是auto_increment,那么您可以按照下面的查询
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;
希望这能解决您的问题。
我正在编写一个程序,将数据从 table data_entry
复制到另一个 table promotional
Table data_entry
的结构如下(排除无关字段)-
CREATE TABLE `data_entry` (
`school_id` int(11) NOT NULL AUTO_INCREMENT,
`school_name` varchar(255) NOT NULL,
`mobile_number` varchar(15) DEFAULT NULL,
`email` varchar(50) DEFAULT NULL,
`website` varchar(255) DEFAULT NULL,
`city` varchar(250) DEFAULT NULL,
`pin` varchar(6) DEFAULT NULL,
`is_copied_to_promo` tinyint(4) DEFAULT '0'
PRIMARY KEY (`school_id`)
)
Table promotional
的结构(不包括非相关字段)
CREATE TABLE `promotional` (
`promo_id` int(11) NOT NULL AUTO_INCREMENT, //renamed to avoid confusion
`school_name` varchar(255) NOT NULL,
`mobile_number` varchar(15) DEFAULT NULL,
`email` varchar(50) DEFAULT NULL,
`website` varchar(255) DEFAULT NULL,
`city` varchar(250) DEFAULT NULL,
`pin` varchar(6) DEFAULT NULL,
`copied_school_id` INT, // edit - school_id of data_entry table will go here
PRIMARY KEY (`promo_id`)
)
这是将所有行从 data_entry
复制到 promotional
的过程,其中 is_copied_to_promo=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_entry
table 中所有 inserted/affected 行的 is_copied_to_promo
更新为 1
,以便每个我执行上述过程时,只有来自 data_entry
table 的新行应该复制到 promotional.
我正在通过 PHP
代码调用此过程。解决方案可以是在同一过程中添加更新查询,或者在执行 uspCopySchoolsToPromotional
.
提前致谢。
编辑:
我忘了提到两个 table 中的 school_id 是不同的。在促销 table 中,数据来自多个来源。所以我在促销 table 中将 school_id
重命名为 promo_id
以避免您混淆。
如果你也复制了 school_id 那么你就有了一个唯一的密钥可以使用,然后你可以在 INSERT 之后添加一个 UPDATE 来做到这一点,比如:
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 应该有常见的 Table 表达式,但它似乎没有出现在 release announcements, so you will have to use some other mechanism to implement this. One solution is to use an after insert trigger
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
另一种解决方案是在插入
之后采取table级别的锁和更新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;
请注意,如果您不锁定 table,您可能会发现竞争条件会导致不一致。这两种方法(触发 vs 锁定和更新)各有利弊。
如果您在两个表中都没有 School_id 作为 auto_increment,您可以按照 Flauntster 的查询。
如果两个表中的列都是auto_increment,那么您可以按照下面的查询
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;
希望这能解决您的问题。