PostgreSQL.md
... ...
@@ -5,9 +5,8 @@
5 5
**下载地址:** [Open-Source, Enterprise Postgres Database Management](https://www.enterprisedb.com/downloads/postgres-postgresql-downloads)
6 6
7 7
8
-## 第一节.PostgreSQL 本地和 Docker 安装步骤
8
+## 第一节.本地和Docker安装步骤
9 9
### 1. 本地安装 PG
10
-
11 10
以下是在本地 Windows 系统上安装 PostgreSQL 16.6 的流程:
12 11
13 12
1. **下载安装包**
... ...
@@ -134,7 +133,7 @@ CREATE TABLE example (
134 133
### 2.2 索引问题
135 134
在 PostgreSQL 里,索引名称的最大长度受标识符最大长度限制,官方规定标识符最大长度为 63 字节。若标识符(如表名、列名、索引名等)长度超 63 字节,会自动截断并发出警告。
136 135
137
-#### 1. PostgreSQL 索引命名规则与实践
136
+**1. PostgreSQL 索引命名规则与实践**
138 137
139 138
1. **基本规则**
140 139
... ...
@@ -206,12 +205,12 @@ CREATE TABLE example (
206 205
207 206
### 2.3 PG 支持 Transactional DDL
208 207
209
-#### 1. 参考资料
208
+**1. 参考资料**
210 209
211 210
- [PostgreSQL 中的事务性 DDL: 数据库对比](https://www.rockdata.net/zh-cn/blog/transactional-ddl/)
212 211
- [Transactional DDL in PostgreSQL: A Competitive Analysis](https://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis)
213 212
214
-#### 2. 什么是 Transactional DDL?
213
+**2. 什么是 Transactional DDL?**
215 214
216 215
Transactional(事务)在关系型数据库是指一组 SQL 语句,要么提交,要么全部回滚。事务中包含的语句通常是 DML 语句,如 `INSERT`、`UPDATE`、`DELETE` 等。但对于 DDL 语句呢?是否可以在事务中包含诸如 `CREATE`、`ALTER`、`DROP` 等 DDL 命令?
217 216
... ...
@@ -276,11 +275,11 @@ postgres=*# CREATE INDEX CONCURRENTLY idx_id ON a_test (id);
276 275
ERROR: CREATE INDEX CONCURRENTLY cannot run inside a transaction block
277 276
```
278 277
279
-#### 3. Transactional DDL 的好处
278
+**3. Transactional DDL 的好处**
280 279
281 280
在进行一些模式升级等复杂工作时,可以利用此功能保护数据库。我们可以将所有更改都放入事务块中,确保它们都以原子方式应用,或者根本不应用。这大大降低了数据库因模式更改中的输入错误或其他此类错误而损坏数据库的可能性。
282 281
283
-#### 4. PG 中的事务性 DDL: 数据库对比
282
+**4. PG 中的事务性 DDL: 数据库对比**
284 283
285 284
**事务性 DDL**
286 285
... ...
@@ -382,13 +381,13 @@ SELECT COUNT(*) FROM cities;
382 381
383 382
PostgreSQL 的自动类型转换规则是比较严格的,尤其是从字符串到其他类型的转换,通常需要显式指定 PostgreSQL 要求显式的数据类型转换。
384 383
385
-#### 1. 示例:数据类型转换错误
384
+**1. 示例:数据类型转换错误**
386 385
387 386
```sql
388 387
INSERT INTO a_test (age) VALUES ('123'); -- 错误:字段 "age" 的类型为 integer, 但表达式的类型为 character varying
389 388
```
390 389
391
-#### 2. 解决方法
390
+**2. 解决方法**
392 391
393 392
在插入或更新数据时,确保数据类型匹配,或使用显式类型转换:
394 393
... ...
@@ -396,7 +395,7 @@ INSERT INTO a_test (age) VALUES ('123'); -- 错误:字段 "age" 的类型为 i
396 395
INSERT INTO a_test (age) VALUES (CAST('123' AS INTEGER));
397 396
```
398 397
399
-#### 3. 自动类型转换(Implicit Casting)
398
+**3. 自动类型转换(Implicit Casting)**
400 399
401 400
PostgreSQL 会在某些情况下自动进行数据类型转换,以确保操作的正确性。这些情况主要是为了匹配操作符或函数的参数类型。
402 401
... ...
@@ -426,7 +425,7 @@ PostgreSQL 会在某些情况下自动进行数据类型转换,以确保操作
426 425
SELECT 42 || ' apples'; -- 结果为 '42 apples'
427 426
```
428 427
429
-#### 4. 显式类型转换(Explicit Casting)
428
+4. **显式类型转换(Explicit Casting)**
430 429
431 430
显式类型转换是 PostgreSQL 中推荐的做法,用于明确地将数据从一种类型转换为另一种类型。以下是几种常用的显式类型转换方法:
432 431
... ...
@@ -462,7 +461,7 @@ PostgreSQL 会在某些情况下自动进行数据类型转换,以确保操作
462 461
SELECT '25'::integer; -- 结果为 25
463 462
```
464 463
465
-#### 5. 类型转换的注意事项
464
+5. **类型转换的注意事项**
466 465
467 466
1. **避免非显式转换**:
468 467
... ...
@@ -511,7 +510,7 @@ PostgreSQL 会在某些情况下自动进行数据类型转换,以确保操作
511 510
SELECT CAST('text' AS INTEGER); -- 抛出错误:invalid input syntax for type integer
512 511
```
513 512
514
-#### 6. 示例
513
+6. **示例**
515 514
516 515
以下是一些常见的类型转换示例:
517 516
... ...
@@ -546,10 +545,9 @@ PostgreSQL 会在某些情况下自动进行数据类型转换,以确保操作
546 545
547 546
### 2.5 PostgreSQL 错误:`current transaction is aborted, commands ignored until end of transaction block`
548 547
549
-#### 1. 错误概述
548
+1. **错误概述**
550 549
551 550
当 PostgreSQL 事务中的某条 SQL 语句执行失败时,整个事务会进入 **中止状态**(Aborted)。所有后续的 SQL 命令都会被忽略,直到事务被回滚或关闭。此时任何后续操作都会触发以下错误:`current transaction is aborted, commands ignored until end of transaction block`。
552
-
553 551
**核心问题**:事务未正确终止(未提交或回滚),导致数据库连接处于不可用状态。
554 552
555 553
**错误信息**:
... ...
@@ -559,7 +557,7 @@ caused by: org.postgresql.util.PSQLException: 错误: 当前事务被终止, 事
559 557
current transaction is aborted, commands ignored until end of transaction block
560 558
```
561 559
562
-#### 2. 事务块中语句错误的回滚行为:数据库对比
560
+2. **事务块中语句错误的回滚行为:数据库对比**
563 561
564 562
**摘要**:在本文中,我们将学习事务块中语句错误的回滚行为,以及 PostgreSQL 和 Oracle 之间的区别。
565 563
... ...
@@ -655,7 +653,7 @@ SELECT * FROM DEMO;
655 653
2 02-AUG-21 11.04.16.601105 PM +00:00
656 654
```
657 655
658
-#### 3. 错误原因
656
+3. **错误原因**
659 657
660 658
**3.1 直接原因**
661 659
... ...
@@ -671,7 +669,7 @@ SELECT * FROM DEMO;
671 669
| 权限不足 | 普通用户尝试执行 `DROP TABLE` |
672 670
| 隐式事务未处理 | ORM 框架或客户端工具默认开启事务,但未捕获异常并回滚 |
673 671
674
-#### 4. 解决方法
672
+4. **解决方法**
675 673
676 674
**1. 立即终止事务**
677 675
... ...
@@ -715,7 +713,7 @@ ROLLBACK; -- 终止当前事务,清除错误状态
715 713
GRANT INSERT, UPDATE ON table_name TO user_name;
716 714
```
717 715
718
-#### 5. 高级场景与优化
716
+5. **高级场景与优化**
719 717
720 718
**1. 使用保存点(SAVEPOINT)**
721 719
... ...
@@ -731,7 +729,7 @@ INSERT INTO table3 VALUES (1);
731 729
COMMIT;
732 730
```
733 731
734
-#### 6. 预防措施
732
+6. **预防措施**
735 733
736 734
| 措施 | 说明 |
737 735
| ------------------ | ----------------------------------------------------------- |