MySQL存储过程,从一个表读取并插入到另一个表

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='

我有以下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='" . ($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,谢谢您的持续跟踪。我需要一个过程来处理这一切。我在答案中给你的过程会有帮助吗?