ec711de922d56ea8eda671c8a66577fb117f9951
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 | | ------------------ | ----------------------------------------------------------- | |