MySQL存储过程,从一个表读取并插入到另一个表
我有以下PHP代码,我想将其转换为MySQL存储过程。由于应用程序的要求,我不想在db级别检查重复错误错误代码,它必须以与PHP相同的方式完成MySQL存储过程,从一个表读取并插入到另一个表,mysql,stored-procedures,Mysql,Stored Procedures,我有以下PHP代码,我想将其转换为MySQL存储过程。由于应用程序的要求,我不想在db级别检查重复错误错误代码,它必须以与PHP相同的方式完成 $sql2 = "SELECT zip__ID FROM zip WHERE zip_code='" . $zip . "' "; $result2 = mysql_query($sql2); if (mysql_num_rows($result2) == 0) { $sql3 = "INSERT INTO zips SET zip_code='
$sql2 = "SELECT zip__ID FROM zip WHERE zip_code='" . $zip . "' ";
$result2 = mysql_query($sql2);
if (mysql_num_rows($result2) == 0) {
$sql3 = "INSERT INTO zips SET zip_code='" . ($zip) . "'";
mysql_query($sql3);
$newZip = mysql_insert_id();
} else {
$row2 = mysql_fetch_array($result2);
$newZip = $row2['zip_id'];
}
//更新:2015年5月6日。
我一共有6张桌子
表1包含zip、city、state、country等字段。这是varchar格式的。
|ID | ZIP |城市|州|国家|
|美国佛罗里达州劳德代尔堡1 | 33430 |
还有四个表是:
表2:拉链id、邮政编码
表3:城市id、城市名称
表4:州id、州名称
表5:国家id、国家/地区名称
我想将表1中的日期插入表6,这是表1的副本。唯一的区别是在表6中,我想在表1中插入数据的ID。因此,对于表6中的每个插入,我必须在4个表2、3、4和5中运行一个查询。例如,如果表1中的邮政编码是33430,而表2中不存在它,首先我需要插入它,获取它的ID,然后在表6中插入
我必须对表1中的所有字段执行相同的操作
因此,如果我使用PHP,我将做什么:
$sql = "SELECT * FROM Table1";
$result = mysql_query($sql);
while($row=mysql_fetch_array($result){
$zip = $row['zip'];
$city = $row['city'];
$state = $row['state'];
$country = $row['country'];
//Process zip code
$sql2 = "SELECT zip_id FROM zips WHERE zip_code='" . $zip . "' ";
$result2 = mysql_query($sql2);
if (mysql_num_rows($result2) == 0) {
$sql3 = "INSERT INTO zips SET zip_code='" . ($zip) . "'";
mysql_query($sql3);
$newZip = mysql_insert_id();
} else {
$row2 = mysql_fetch_array($result2);
$newZip = $row2['zip_id'];
}
mysql_free_result($result2);
//Process city
$sql2 = "SELECT city_id FROM cities WHERE city_name='" . $city . "' ";
$result2 = mysql_query($sql2);
if (mysql_num_rows($result2) == 0) {
$sql3 = "INSERT INTO cities SET city_name='" . ($city) . "'";
mysql_query($sql3);
$newCity = mysql_insert_id();
} else {
$row2 = mysql_fetch_array($result2);
$newCity = $row2['city_id'];
}
mysql_free_result($result2);
//process other two tables......
}mysql_free_result($result);
我也不是MySQL专家,但这就是我能找到的。不过,您必须检查语法。但我想强调这一点。我在谷歌上搜索了两个信息来源,然后我给你打了出来。如果我能做到,我相信你也能做到
CREATE PROCEDURE UpdateTable6()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE i, a, b, c, d INT;
DECLARE va, vb, vc, vd CHAR(<yourmax>);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
DECLARE cur1 CURSOR FOR SELECT id, zip, city, state, country FROM table1;
OPEN cur1;
read_loop: LOOP
FETCH cut1 into i, va, vb, vc, vd;
IF done THEN
LEAVE read_loop;
END IF;
--REPEAT THIS FOR ALL 4 TABLES
IF (SELECT 1 = 1 FROM Table2 WHERE zip_code=va) THEN
BEGIN
SELECT a = TableID FROM Table2 WHERE zip_code=va;
END;
ELSE
BEGIN
INSERT INTO Table2 (zip_code) VALUES(va);
SELECT a = LAST_INSERT_ID();
END;
END IF;
--CHECK DETAILS IN TABLE6
IF (SELECT 1 = 1 FROM Table6 WHERE id=i) THEN
BEGIN
UPDATE TABLE6 set zip_id = a, city_id = b, state_id = c, country_id = d where id = i
END;
ELSE
BEGIN
INSERT INTO Table6 (zip_id, city_id, state_id, country_id ) VALUES(a, b, c, d);
END;
END IF;
END LOOP;
CLOSE cur1;
END;
My source where您可以在一条sql语句中使用IF EXISTS来完成这项工作。你在MySQL中设置了吗?Insert语句systax通常是Insert TABLE VALUES或Insert TABLE SELECT。不幸的是,这不是必需的。必须按照前面提到的方式来做。我必须从一个表中选择值,然后查看是否存在多个表,然后在需要的地方插入。好的,但问题是什么。除了insert语句的语法外,如果没有结果,您将在表中插入一个值。好的,让我解释一下整个场景。上面的代码只是我想要构建的一部分。实际上,下面是我想要的。不仅涉及两个表,还涉及更多的表。我必须从不同的字段中读取一个表,并在插入后或通过选择它是否已经存在,从相应的表中获取它的ID。第一个表的每个字段都指向另一个主表。我仍然不理解您的问题,因为您需要做的只是刚才解释的内容。你不知道怎么做吗?你是新来的吗?您对如何执行此操作有基本了解吗?谢谢,但我想为此编写一个存储过程。在PHP中,所有这些都是毫无问题地完成的。。现在听起来好多了。对不起,我一定错过了你问题中的一个陈述。您是希望为每个记录调用proc,还是希望在php中处理记录循环,并为每个记录执行一次proc,谢谢您的持续跟踪。我需要一个过程来处理这一切。我在答案中给你的过程会有帮助吗?