gpt4 book ai didi

mysql - START TRANSACTION 在 BEGIN ... END 上下文或外部和 LOOP 语法中

转载 作者:可可西里 更新时间:2023-11-01 06:57:45 24 4
gpt4 key购买 nike

我有两个关于 MySQL 中的复合语句和事务的问题。

首先:

MySQL手册中有两个注释:

Note

Within all stored programs, the parser treats BEGIN [WORK] as the beginning of a BEGIN ... END block. To begin a transaction in this context, use START TRANSACTION instead.

Note

Within all stored programs (stored procedures and functions, triggers, and events), the parser treats BEGIN [WORK] as the beginning of a BEGIN ... END block. Begin a transaction in this context with START TRANSACTION instead.

我不明白具体是什么意思。他们的意思是我必须放置 START TRANSACTION 而不是 BEGIN 或紧跟在 BEGIN 之后?

// 1st variant:

BEGIN
START TRANSACTION
COMMIT
END


// 2nd variant:

START TRANSACTION
COMMIT
END

第一个变体还是第二个变体,哪一个是正确的方法?

第二:

我不想创建存储过程或函数。我只想在一般流程中创建一个内部有循环的复合语句 block ,如下所示:

USE 'someDb';
START TRANSACTION
... create table statement
... insert statement

// now I want to implement some insert/select statements using loop, I do as follows:

DELIMITER $
BEGIN
SET @n = 1, @m = 2;
lab1: LOOP

... some insert, select statements here

END LOOP lab1;
END $
DELIMITER ;

END

COMMIT

这种结构有可能吗?因为我抛出了一个错误:

Query: BEGIN SET @n = 1, @m = 2; lab1: LOOP SELECT ...
Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET @n = 1, @m = 2;
lab1: LOOP SELECT ...

我的问题是:

  1. 是否允许仅在一般流程中使用 BEGIN...END 而无需创建和使用存储过程或函数?
  2. 是否允许在 START TRANSACTION...COMMIT 中使用 BEGIN...END 或者我必须将 START TRANSACTION.. .COMMITBEGIN...END 内?

    BEGIN
    START TRANSACTION
    COMMIT
    END

    // vs.

    START TRANSACTION
    BEGIN
    END
    COMMIT
  3. 如果我只想使用 LOOP,我一定要使用 BEGIN...END 吗?我可以只使用 LOOP 语法而不开始 BEGIN...END 吗? LOOP 手册中的唯一示例是:

      CREATE PROCEDURE doiterate(p1 INT)
    BEGIN
    label1: LOOP
    ...

最佳答案

  1. Is it allowed to use BEGIN...END just in general flow without creating and using Stored Procedures or Functions?

    否:复合语句只能在存储程序的主体中使用。

  2. Is it allowed to use BEGIN...END inside of START TRANSACTION...COMMIT or I have to put START TRANSACTION...COMMIT inside of BEGIN...END?

    START TRANSACTION;COMMIT; 是单独的语句。如果您希望存储程序的主体包含多条语句,则需要将这些语句包含在某种复合语句 block 中,例如 BEGIN ... END(类似于包含一个 block 类 C 语言中大括号 { ... } 中的语句)。

    就是说,您可以有一个仅包含单语句START TRANSACTION;COMMIT; 的存储程序——这样的程序不需要任何复合语句 block ,只会分别开始新的/提交当前事务。

    在不允许复合语句 block 的存储程序之外,您可以在需要时发出 START TRANSACTION;COMMIT; 语句作为 &。

  3. Do I by all means have to use BEGIN...END if I want to use only LOOP? May I just use LOOP syntax without starting BEGIN...END?

    LOOP也是一个复合语句 block ,只在存储过程中有效。 没有必要LOOP block 包含在 BEGIN ... END block 中,尽管这很常见(否则很难执行任何所需的循环初始化)。

在您的情况下,您显然希望从循环构造中将数据插入表中,您将需要:

  • 定义一个使用LOOP的存储程序;

  • 在外部程序中迭代一个循环,在每次迭代时执行数据库查询;或者

  • 根据 SQL 可以直接操作的集合重新定义您的逻辑。

关于mysql - START TRANSACTION 在 BEGIN ... END 上下文或外部和 LOOP 语法中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12259675/

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