Mysql如果不存在,会在存储过程中给我一个错误
我在Mysql如果不存在,会在存储过程中给我一个错误,mysql,stored-procedures,phpmyadmin,Mysql,Stored Procedures,Phpmyadmin,我在phpmyadmin中使用mysql有以下存储过程: CREATE DEFINER=`user`@`localhost` PROCEDURE `set_address`(IN `patient_street` VARCHAR(128), IN `patient_city` VARCHAR(45), IN `patient_post_code` VARCHAR(45), IN `patient_state_or_province` VARCHAR(45), IN `patient_count
phpmyadmin
中使用mysql
有以下存储过程:
CREATE DEFINER=`user`@`localhost` PROCEDURE `set_address`(IN `patient_street` VARCHAR(128), IN
`patient_city` VARCHAR(45), IN `patient_post_code` VARCHAR(45), IN `patient_state_or_province` VARCHAR(45), IN `patient_country` VARCHAR(45))
NOT DETERMINISTIC NO SQL SQL SECURITY
DEFINER
BEGIN
IF NOT EXISTS (SELECT a.address_id FROM address as a where a.street = patient_street and a.city = patient_city and a.post_code = patient_post_code and a.country = patient_country)
THEN
BEGIN
INSERT INTO address (street, city, post_code, state_or_province, country) VALUES (patient_street, patient_city, patient_post_code, patient_state_or_province, patient_country);
SELECT LAST_INSERT_ID();
END;
ELSE
BEGIN
SELECT a.address_id FROM address as a where a.street = patient_street and a.city = patient_city and a.post_code = patient_post_code and a.country = patient_country
END;
END IF;
END;
但是,我在中发现了两个错误(如果不存在的话)
:
就我个人而言,如果我需要编写一个执行指定操作的过程,并返回一个resultset,我会这样写:
DELIMITER $$
CREATE DEFINER=`user`@`localhost` PROCEDURE `set_address`
(IN `patient_street` VARCHAR(128)
,IN `patient_city` VARCHAR(45)
,IN `patient_post_code` VARCHAR(45)
,IN `patient_state_or_province` VARCHAR(45)
,IN `patient_country` VARCHAR(45)
)
NOT DETERMINISTIC SQL SECURITY DEFINER
BEGIN
DECLARE li_address_id BIGINT DEFAULT NULL;
-- check for existing row and get address_id
SELECT a.address_id
INTO li_address_id
FROM address a
WHERE a.street = patient_street
AND a.city = patient_city
AND a.post_code = patient_post_code
AND a.country = patient_country
LIMIT 1 ;
-- if we didn't find a matching row
IF li_address_id IS NULL THEN
-- add a row and get the new address_id
INSERT INTO address (street, city, post_code, state_or_province, country) VALUES
(patient_street, patient_city, patient_post_code, patient_state_or_province, patient_country);
SELECT LAST_INSERT_ID() INTO li_address_id;
END IF;
-- return address_id (either found existing row, or newly added row) as a resultset
SELECT li_address_id AS address_id;
END$$
DELIMITER ;
如果存在一行,我们不需要运行两个
SELECT
语句。我们可以对该行进行检查,并通过单个SELECT
获取地址id
如果我们没有得到匹配的行,那么我们插入一行,并检索自动增量id
在任何一种情况下(找到的行或添加的行),都可以将地址_id作为结果集返回。同样,我们可以使用一个SELECT语句而不是两个不同的语句来实现这一点
对我来说,限制返回结果集的位置数和查询数据库的次数更有意义。每个if都必须有一个then和end if。insert语句也没有多大意义,不能将insert…值与这样的select混合使用。mysql也不需要数据库中的begin end块n if end if block.@P.Salmon我想首先检查地址是否已经存储在我的数据库中,否则存储它并获取它的相应id。您可能需要终止insert..values语句。@P.Salmon我更新了代码。仍然会收到相同的错误。您确实应该删除终止语句的要求-您丢失了;在end if和all end blocks之后,您还没有显示正在重置过程创建代码之前和之后的分隔符(您也没有显示)。