BEGIN TRANSACTION; FOR i IN 10..30 LOOP INSERT INTO demo (id) VALUES (i); END LOOP; COMMIT; 在PG中对吗
时间: 2024-10-14 22:15:43 浏览: 19
在PostgreSQL中,`BEGIN TRANSACTION;`,`FOR i IN 10..30 LOOP`, `INSERT INTO demo (id) VALUES (i);`, 和 `COMMIT;` 这些语句是一段典型的用于批量插入数据的T-SQL(Transact-SQL)示例,但这实际上是Oracle SQL的一种语法。在PostgreSQL中,虽然它们的逻辑类似,但语法上会有差异:
- `BEGIN TRANSACTION;` 对应于 `BEGIN;`,这是开始一个新的事务。
- `FOR i IN 10..30 LOOP` 在PostgreSQL里会变成一个循环,例如 `FOR i IN 10..30 DO ... LOOP END DO;`,因为PostgreSQL更倾向于使用`DO`关键字而不是`.`。
- `INSERT INTO demo (id) VALUES (i);` 这个SQL语句是正确的,用于向名为 "demo" 的表插入一行,其中 id 等于当前的循环变量 `i`。
- `COMMIT;` 保持不变,表示提交当前事务。
所以,如果要在PostgreSQL中实现类似的功能,你会看到这样的形式:
```sql
BEGIN;
FOR i IN 10..30 LOOP
INSERT INTO demo (id) VALUES (i);
END LOOP;
COMMIT;
```
记得在PostgreSQL中,每个 `DO` 循环内部都应该是可重复执行的独立命令块,而不仅仅是单条 `INSERT` 语句。
相关问题
BEGIN for i in 10..30 LOOP insert into demo(id) values(i); end loop; commit; end; 有错误吗
这段SQL脚本看起来是用来插入数据到名为demo的表中的,循环从10到30,每次循环将当前数值i插入id列。整个过程包括了`FOR LOOP`结构的初始化、循环体(`LOOP`至`END LOOP`)以及提交事务(`COMMIT`)。然而,在标准的SQL语法中,`BEGIN`和`END`通常用于启动和结束存储过程或触发器,而不是在循环语句中。
在Oracle或PL/SQL中,这可能会是一个存储过程的一部分,但在标准的SQL(如MySQL,PostgreSQL等)中,它应该放在`BEGIN TRANSACTION`和`COMMIT`之间,因为`COMMIT`会自动结束当前事务,而不会包裹在一个循环里。
所以,如果你是在一个支持PL/SQL的环境中,比如Oracle,这段代码可能没问题,因为它会被视为一个匿名块。但如果是在纯SQL中,`BEGIN`和`END`应该是不必要的,而且在循环外部提交事务才合适。
正确的做法是:
```sql
BEGIN TRANSACTION;
FOR i IN 10..30 LOOP
INSERT INTO demo (id) VALUES (i);
END LOOP;
COMMIT;
```
阅读全文