gpt4 book ai didi

mysql - 将 MS-SQL 存储过程转换为 MYSQL,但由于语法错误现在无法创建

转载 作者:行者123 更新时间:2023-11-29 02:14:33 25 4
gpt4 key购买 nike

我有很强的 MS-SQL 背景,但直到昨天才看到一行 mysql。我需要将我的 ms-sql 存储过程转换为 mysql,我认为我做对了但是当我尝试执行 sql 来创建过程时,我只是得到不正确的语法错误,如“#1064 - 你的 SQL 中有错误语法;检查与您的 MySQL 服务器版本对应的手册,了解在第 10 行的“//”附近使用的正确语法。存储过程非常简单,所以我觉得我没能弄明白这一点很愚蠢。顺便说一句,食谱表上有一个名为 ID 的标识,这就是我使用 scope_identity 的原因。

MS-SQL

CREATE PROCEDURE ins_recipe
@Name varchar(8000),
@Directions varchar(8000);
AS
IF NOT EXISTS(SELECT * FROM recipe WHERE Name = @Name)
BEGIN
INSERT INTO recipe ('name', 'directions')
SELECT @Name, @Directions;

SELECT SCOPE_IDENTITY;
END
ELSE
BEGIN
UPDATE recipe
SET Directions = @Directions
WHERE Name = @Name;

SELECT ID FROM recipe WHERE Name = @Name;
END
GO

我不知道如何在 mysql 中完成这一切,所以这只是我的开始尝试

DELIMITER //

CREATE PROCEDURE ins_recipe (IN
p_Name varchar(8000),
p_Directions varchar(8000))
BEGIN
INSERT INTO `recipe` (Name, Directions)
SELECT * FROM (SELECT p_Name, p_Directions) AS tmp
WHERE NOT EXISTS(SELECT Name FROM `recipe` WHERE Name = p_Name) LIMIT 1;

SELECT LAST_INSERT_ID();
END //

如有任何帮助,我们将不胜感激。我得到的错误是//附近有不正确的语法,并引用我正确的 mysql 文档。如果有人想帮助我转换整个过程,我也将不胜感激,但此时克服语法错误是我的首要任务。

最佳答案

对于 MySQL,我建议如下。首先,创建一个唯一的索引/约束,以防止重名:

create unique index unq_recipe_name on recipe(name);

然后,使用重复键插入编写函数:

DELIMITER //

CREATE PROCEDURE ins_recipe (
IN p_Name varchar(8000),
IN p_Directions varchar(8000)
)
BEGIN
INSERT INTO `recipe` (Name, Directions)
VALUES (p_Name, p_Directions)
ON DUPLICATE KEY UPDATE name = p_name; -- this is a no op
SELECT LAST_INSERT_ID();
END; //

这种方法的优点是数据库维护数据的完整性。如果没有索引,两个独立的进程可能会将两个具有相同名称的食谱插入到数据库中。

这是如何运作的?如果找到重复项,则调用 ON DUPLICATE KEY 子句。 name = p_name 是空操作,因为 name 已经有了那个值。

关于mysql - 将 MS-SQL 存储过程转换为 MYSQL,但由于语法错误现在无法创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42179177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com