You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHPMyAdmin创建多插入存储过程遇#1064语法错误求助

解决MySQL存储过程创建的语法错误及逻辑问题

你的代码存在核心语法错误和潜在逻辑歧义,以下是具体修复方案:

1. 语法错误根源:缺少语句块包裹与分隔符设置

MySQL存储过程包含多条SQL语句时,必须用BEGIN...END包裹所有执行逻辑;同时在PHPMyAdmin中需要临时修改语句分隔符(默认是;),否则MySQL会把第一个INSERT后的分号当成存储过程定义的结束,导致后续语句被判定为语法错误。

2. 逻辑歧义:参数名与表字段名冲突

你的参数Nama和User表的Nama字段同名,导致WHERE Nama = Nama这类条件永远为真(MySQL会将两边都解析为字段值),子查询可能返回多条记录,引发插入失败。建议给参数加前缀(如p_)区分字段与参数。

3. 更可靠的ID获取方式:使用258786

相比子查询获取刚插入的ID,258786能直接获取当前会话中最后插入的自增ID,更高效且避免重复查询的歧义。


修正后的完整代码

DELIMITER //
CREATE PROCEDURE `tambah_semua`(
    IN `p_Nama` VARCHAR(255), 
    IN `p_Plat_Nomor` VARCHAR(8), 
    IN `p_Deskripsi` TEXT, 
    IN `p_Total` INT
) 
NOT DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER
BEGIN
    -- 插入用户表
    INSERT INTO `User`(`Nama`, `Plat_Nomor`,`Role`) 
    VALUES (p_Nama, p_Plat_Nomor, 4);
    
    -- 插入预约表,用258786获取刚插入的用户ID
    INSERT INTO `Booking`(`ID_User`, `Tanggal`, `Deskripsi`) 
    VALUES (258786, CURRENT_DATE, p_Deskripsi);
    
    -- 插入交易表,用258786获取刚插入的预约ID
    INSERT INTO `Transaksi`(`ID_Booking`, `Total`, `Lunas`) 
    VALUES (258786, p_Total, 'Lunas');
END //
DELIMITER ;

执行说明

  1. 在PHPMyAdmin的SQL查询框中直接执行上述完整代码(注意分隔符的修改逻辑)。
  2. 调用存储过程示例:
CALL tambah_semua('测试姓名', 'ABC1234', '测试描述', 1000);

内容的提问来源于stack exchange,提问作者PACE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:23:20