【PostgreSQL数据分析实战:从数据清洗到可视化全流程】1.4 数据库与表的基本操作(DDL/DML语句)

👉 点击关注不迷路
👉 点击关注不迷路
👉 点击关注不迷路


文章大纲

  • 1.4 数据库与表的基本操作(DDL/DML语句)
    • 1.4.1 数据库生命周期管理(DDL核心)
      • 1.4.1.1 创建数据库(CREATE DATABASE)
        • 最佳实践
      • 1.4.1.2 查看数据库信息
      • 1.4.1.3 修改数据库(ALTER DATABASE)
      • 1.4.1.4 删除数据库(DROP DATABASE)
    • 1.4.2 表结构定义与约束(DDL核心)
      • 1.4.2.1 数据类型速查表
      • 1.4.2.2 创建表(CREATE TABLE)
        • 约束类型对比
      • 1.4.2.3 修改表结构(ALTER TABLE)
      • 1.4.2.4 删除表(DROP TABLE)
    • 1.4.3 数据操作语言(DML核心)
      • 1.4.3.1 插入数据(INSERT)
      • 1.4.3.2 查询数据(SELECT)
        • 基础语法结构
        • 常用函数
      • 1.4.3.3 更新数据(UPDATE)
      • 1.4.3.4 删除数据(DELETE)
    • 1.4.4 事务管理与锁定机制
      • 1.4.4.1 事务控制语句
        • ACID特性保障
      • 1.4.4.2 锁机制
    • 1.4.5 实战案例:电商订单表设计
      • 1.4.5.1 表结构定义
      • 1.4.5.2 高频操作示例
        • 订单查询(带索引优化)
        • 批量订单导入(COPY命令)
    • 1.4.6 最佳实践与规范
      • 1.4.6.1 `命名规范 !!!`
      • 1.4.6.2 性能优化建议
      • 1.4.6.3 数据完整性保障
    • 1.4.7 常见错误与解决方案
      • 1.4.7.1 约束冲突处理
      • 1.4.7.2 大表操作技巧
    • 1.4.8 总结:构建健壮的数据模型

1.4 数据库与表的基本操作(DDL/DML语句)

在这里插入图片描述

1.4.1 数据库生命周期管理(DDL核心)

1.4.1.1 创建数据库(CREATE DATABASE)

-- 基础语法
-- 基础语法
CREATE DATABASE analytics_db
WITH OWNER = postgres              -- 所有者ENCODING = 'UTF8'             -- 字符编码
--    LC_COLLATE = 'en_US.utf8'     -- 排序规则
--    LC_CTYPE = 'en_US.utf8'       -- 字符分类TABLESPACE = pg_default       -- 表空间CONNECTION LIMIT = -1         -- 最大连接数(-1无限制)TEMPLATE = template0;         -- 模板数据库

在这里插入图片描述

最佳实践
  • 使用TEMPLATE template1创建支持中文的数据库
  • 通过pg_tablespace查看可用表空间
  • 生产环境建议单独创建业务表空间:
    CREATE TABLESPACE data_ts LOCATION '/data/pg_tablespace';
    

1.4.1.2 查看数据库信息

命令说明
\lSELECT * FROM pg_database;列出所有数据库
SELECT datname, datsize FROM pg_database;查看数据库名称及大小
\conninfo当前连接的数据库信息

1.4.1.3 修改数据库(ALTER DATABASE)

-- 修改所有者
ALTER DATABASE analytics_db OWNER TO data_team;-- 限制连接数
ALTER DATABASE analytics_db CONNECTION LIMIT 100;-- 更改参数配置(会话级生效)
ALTER DATABASE analytics_db SET work_mem = '32MB';

1.4.1.4 删除数据库(DROP DATABASE)

-- 强制删除(终止所有连接)
DROP DATABASE IF EXISTS analytics_db WITH (FORCE);

在这里插入图片描述

⚠️ 注意:删除前请通过SELECT * FROM pg_stat_activity WHERE datname='analytics_db';确认无活动连接

1.4.2 表结构定义与约束(DDL核心)

1.4.2.1 数据类型速查表

类型分类常用数据类型存储范围/特性示例值
数值型INT/BIGINT4/8字节整数100, -500
DECIMAL(p,s)高精度十进制数(p总位数,s小数位)DECIMAL(10,2) → 1234.56
字符型VARCHAR(n)可变长字符串(n为最大长度)‘数据分析’
TEXT无长度限制字符串长文本内容
日期时间DATE年月日(YYYY-MM-DD)‘2023-12-31’
TIMESTAMP WITH TIME ZONE带时区的时间戳‘2024-01-01 10:00:00+08’
布尔型BOOLEAN真/假TRUE/FALSE
二进制BYTEA二进制数据(图片/文件)\xDEADBEEF
几何类型POINT二维坐标(x,y)POINT(10, 20)

1.4.2.2 创建表(CREATE TABLE)

CREATE TABLE departments (dept_id INTEGER PRIMARY KEY,dept_name VARCHAR(50)
);
--员工信息表(含约束)
CREATE TABLE employees (emp_id SERIAL PRIMARY KEY,          -- 自增主键emp_name VARCHAR(50) NOT NULL,       -- 非空约束email VARCHAR(100) UNIQUE,           -- 唯一约束hire_date DATE DEFAULT CURRENT_DATE, -- 默认值约束salary NUMERIC(10,2) CHECK (salary > 0), -- 检查约束department_id INTEGER REFERENCES departments(dept_id) -- 外键约束
);
约束类型对比
约束类型关键字作用性能影响
主键PRIMARY KEY唯一标识记录,自动创建索引读优化,写轻微影响
唯一UNIQUE确保字段值唯一类似主键,允许NULL值
非空NOT NULL禁止字段为空无索引性能影响
检查CHECK自定义逻辑约束每次写入时触发检查
外键REFERENCES建立表间关联级联操作需额外开销

1.4.2.3 修改表结构(ALTER TABLE)

-- 添加字段(带默认值)
ALTER TABLE employees ADD COLUMN phone VARCHAR(20) DEFAULT '未提供';-- 修改数据类型(需重建表)
ALTER TABLE employees ALTER COLUMN salary TYPE NUMERIC(12,2);-- 删除字段(生产环境慎用)
ALTER TABLE employees DROP COLUMN fax;-- 添加外键(延迟约束检查)
ALTER TABLE employees 
ADD CONSTRAINT fk_dept 
FOREIGN KEY (department_id) REFERENCES departments(dept_id)
DEFERRABLE INITIALLY DEFERRED;

1.4.2.4 删除表(DROP TABLE)

-- 级联删除依赖对象
DROP TABLE IF EXISTS employees CASCADE;-- 仅删除表结构,保留数据(PostgreSQL 12+)
TRUNCATE TABLE employees;

💡💡💡 提示:TRUNCATEDELETE FROM 效率高10-100倍,适合清空大表
💡💡💡 提示:TRUNCATEDELETE FROM 效率高10-100倍,适合清空大表
💡💡💡 提示:TRUNCATEDELETE FROM 效率高10-100倍,适合清空大表

1.4.3 数据操作语言(DML核心)

1.4.3.1 插入数据(INSERT)

-- 单条插入
INSERT INTO employees (emp_name, email, salary, department_id)
VALUES ('张三', 'zhangsan@example.com', 15000, 101);-- 批量插入(性能提升30%+)
INSERT INTO employees (emp_name, email, salary, department_id)
VALUES 
('李四', 'lisi@example.com', 16000, 102),
('王五', 'wangwu@example.com', 17000, 101);-- 插入并返回自增ID
INSERT INTO employees (emp_name, email, salary, department_id)
VALUES ('赵六', 'zhaoliu@example.com', 18000, 103)
RETURNING emp_id; -- 返回新生成的emp_id

1.4.3.2 查询数据(SELECT)

基础语法结构
SELECT column1, column2, CASE WHEN salary > 15000 THEN '高薪' ELSE '普通' END AS salary_level -- 条件表达式
FROM employees
WHERE hire_date >= '2023-01-01'  -- 过滤条件AND department_id IN (101, 102)
GROUP BY department_id           -- 分组聚合
HAVING AVG(salary) > 16000       -- 分组后过滤
ORDER BY salary DESC              -- 排序
LIMIT 10 OFFSET 20;               -- 分页(第3页,每页10条)
常用函数
函数分类函数名说明示例
聚合函数COUNT(*) / COUNT(col)计数COUNT(DISTINCT department_id)
SUM/AVG/MAX/MIN数值聚合AVG(salary)
字符串函数CONCAT(str1, str2)字符串拼接CONCAT(emp_name, ’ (', email, ‘)’)
SUBSTRING(str FROM start FOR length)子串提取SUBSTRING(email FROM 1 FOR 5)
日期函数AGE(timestamp)计算时间间隔AGE(hire_date)
DATE_TRUNC(‘month’, date)日期截断到月DATE_TRUNC(‘quarter’, now())
  • 在 PostgreSQL 中,AGE(timestamp) 是一个用于计算时间间隔的函数,主要用于获取 某个时间点与当前时间的间隔,或 两个时间点之间的间隔。以下是关于该函数的详细解析:
      1. 基础语法
      AGE(timestamp)                  -- 计算 timestamp 到当前时间的间隔(等效于 AGE(now(), timestamp))AGE(end_timestamp, start_timestamp)  -- 计算两个时间点之间的间隔(end - start)
      
      1. 参数说明
        参数类型描述示例值
        timestamp单个时间戳(可带时区 timestamptz'2020-01-01 08:00:00'
        end_timestamp结束时间戳(必须晚于或等于开始时间)order_completed_at
        start_timestamp开始时间戳order_created_at
      1. 返回值类型
        返回 interval 类型,格式为 年-月-日 时:分:秒,例如:
        3 years 2 mons 10 days 03:05:15(表示 3 年 2 个月 10 天 3 小时 5 分 15 秒)。
    • 场景 1:计算单个时间点与当前时间的间隔(最常用)

    • 场景 2:计算两个时间点的间隔(如订单处理耗时)

    • 场景 3:带时区的时间戳处理(自动转换为 UTC 计算)

    • 注意事项与最佳实践

      1. 参数顺序的重要性 AGE(end, start) 必须满足 end >= start,否则会返回负数间隔(如 -1 day 00:00:00)。
      1. 时区处理 若时间戳带时区(timestamptz),AGE 会自动将其转换为 UTC 时间进行计算,避免时区偏移导致的误差。
      1. 性能优化 对大表使用 AGE 时,若涉及索引列(如 hire_date),确保该列有索引以加速查询:
      CREATE INDEX idx_hire_date ON employees(hire_date);
      

1.4.3.3 更新数据(UPDATE)

-- 单表更新(设置工资增长5%)
UPDATE employees 
SET salary = salary * 1.05 
WHERE department_id = 101;-- 关联更新(基于部门表)
UPDATE employees e
SET email 
= CONCAT(e.emp_name, '@', d.dept_domain)
FROM departments d
WHERE e.department_id = d.dept_id;

1.4.3.4 删除数据(DELETE)

-- 单表删除(离职员工)
-- 单表删除(离职员工)
DELETE FROM employees 
WHERE hire_date < '2020-01-01' AND NOT EXISTS (SELECT 1 FROM payroll WHERE emp_id = employees.emp_id);-- 跨表级联删除(需外键设置级联)
DELETE FROM departments 
WHERE dept_id = 100; -- 自动删除关联的employees记录

1.4.4 事务管理与锁定机制

1.4.4.1 事务控制语句

-- 显式事务示例(账户转账)
BEGIN TRANSACTION;          -- 开始事务
UPDATE accounts SET balance = balance - 1000 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE user_id = 2;
COMMIT;                     -- 提交事务(永久生效)-- 带保存点的事务
BEGIN;
SAVEPOINT sp1;              -- 设置保存点
UPDATE orders SET status = 'processing' WHERE order_id = 101;
ROLLBACK TO sp1;            -- 回滚到保存点
COMMIT;
ACID特性保障
  • 原子性:事务内操作要么全成功,要么全回滚
  • 一致性:事务前后数据满足约束条件
  • 隔离性:通过SET TRANSACTION ISOLATION LEVEL控制(默认READ COMMITTED)
  • 持久性:提交后数据永久写入磁盘

1.4.4.2 锁机制

锁类型模式作用示例场景
共享锁(S)SELECT … FOR SHARE阻止写操作,允许读并发报表查询时防止数据修改
排他锁(X)SELECT … FOR UPDATE阻止所有并发操作库存扣减时防止超卖
表级锁LOCK TABLE …锁定整张表(性能影响大)批量数据初始化

1.4.5 实战案例:电商订单表设计

1.4.5.1 表结构定义

CREATE TABLE orders (order_id BIGINT PRIMARY KEY DEFAULT generate_ulid(), -- 使用ULID作为主键(比UUID性能高50%)user_id INTEGER NOT NULL REFERENCES users(user_id),order_time TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,total_amount NUMERIC(12,2) CHECK (total_amount > 0),status VARCHAR(20) CHECK (status IN ('待支付', '已支付', '已取消', '已完成')),delivery_address JSONB, -- 存储结构化地址数据INDEX idx_user_id_status (user_id, status), -- 组合索引优化查询TABLESPACE order_ts -- 使用独立表空间
);

1.4.5.2 高频操作示例

订单查询(带索引优化)
-- 优化前:全表扫描(耗时120ms)
SELECT * FROM orders WHERE user_id = 1234 AND status = '已完成';-- 优化后:使用组合索引(耗时8ms)
CREATE INDEX idx_user_id_status ON orders(user_id, status);
批量订单导入(COPY命令)
-- 比INSERT速度快10倍以上
COPY orders (user_id, order_time, total_amount, status, delivery_address)
FROM '/data/orders_202401.csv' 
WITH (FORMAT CSV, HEADER, DELIMITER ',', QUOTE '"');

1.4.6 最佳实践与规范

1.4.6.1 命名规范 !!!

对象类型命名规则示例
数据库业务模块_环境(小写)analytics_dev
复数名词(小写下划线分隔)employee_records
字段小写下划线命名hire_date
约束表名_约束类型_字段名employees_pk_emp_id

1.4.6.2 性能优化建议

    1. **避免使用SELECT ***:显式列出所需字段,减少数据传输
    1. 合理使用JOIN:优先在WHERE子句添加过滤条件,减少关联数据量
    1. 批量操作:使用INSERT ... VALUES (...),(...)替代单条插入
    1. 事务控制:将高频小事务合并,减少日志写入次数

1.4.6.3 数据完整性保障

  • 外键约束必须定义ON DELETE CASCADESET NULL行为
  • 核心业务表启用TRIGGER进行数据校验
  • 定期运行ANALYZE更新统计信息(建议每日凌晨执行)

1.4.7 常见错误与解决方案

1.4.7.1 约束冲突处理

错误信息原因分析解决方案
唯一约束冲突插入重复数据使用INSERT ... ON CONFLICT UPDATE
外键约束失败父表无对应记录先插入父表数据,或设置DEFERRABLE约束
检查约束违反数据不符合自定义规则添加数据清洗步骤,或修改CHECK条件

1.4.7.2 大表操作技巧

-- 在线重命名大表(PostgreSQL 11+)
ALTER TABLE large_table RENAME TO new_large_table;-- 分批次删除数据(避免锁表)
-- 开始一个无限循环,用于分批次删除数据,避免一次性删除大量数据导致锁表和性能问题
WHILE TRUE LOOP-- 从 old_data 表中删除创建时间早于 '2023-01-01' 的数据,每次最多删除 10000 条记录DELETE FROM old_data WHERE create_time < '2023-01-01' LIMIT 10000;-- 检查上一条 DELETE 语句是否删除了任何记录-- 如果没有删除任何记录(即 NOT FOUND 条件为真),则说明已经没有符合条件的数据需要删除IF NOT FOUND THEN-- 当没有符合条件的数据可删除时,退出当前的循环EXIT;END IF;-- 提交当前事务,将已删除的数据永久保存到数据库中-- 分批次提交事务可以减少锁的持有时间,提高并发性能COMMIT;
-- 结束循环
END LOOP;

1.4.8 总结:构建健壮的数据模型

  • 通过掌握DDL与DML的核心语法,我们能够:
      1. 设计符合业务需求的数据表结构(合理使用约束与索引)
      1. 高效操作数据(批量处理、事务控制、性能优化)
      1. 保障数据完整性与一致性(ACID特性、外键约束)

该文章讲解了PostgreSQL的DDL/DML操作。
后续章节将深入讲解数据清洗技巧(使用CTE、窗口函数)、复杂查询优化(执行计划分析)以及与数据分析工具的集成方法。
建议在实践中遵循"先设计ER图,再编写建表语句"的流程,逐步积累数据库设计经验。

  • CTE 即公共表表达式(Common Table Expressions),它是在 SQL 中定义的临时命名结果集,这些结果集只在当前查询的执行期间存在。
    • CTE 的基本语法如下:
      WITH cte_name (column1, column2, ...) AS (-- CTE 的查询语句SELECT column1, column2, ...FROM table_nameWHERE condition
      )
      -- 主查询,使用 CTE
      SELECT *
      FROM cte_name;
      
    • 其中,WITH 关键字用于引入 CTE,cte_name 是 CTE 的名称,括号内可指定列名,AS 后面的括号中是 CTE 的查询语句,最后是使用该 CTE 的主查询。
    • 使用注意事项
      • CTE 的作用域: CTE 只在当前查询中有效,查询执行完毕后,CTE 占用的资源会被释放
      • 性能问题:虽然 CTE 在某些情况下可以提高性能,但在处理大量数据或复杂递归时,可能会导致性能下降。需要根据具体情况进行性能测试和优化。
      • 递归终止条件:在使用递归 CTE 时,必须确保递归有终止条件,否则会导致无限递归,使数据库陷入死循环。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/904150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Fabrice Bellard(个人网站:‌bellard.org‌)介绍

Fabrice Bellard 是法国人&#xff0c;国际著名程序员。1972年生于法国Grenoble&#xff0c;大学就读于巴黎高等综合理工学院&#xff0c;后在国立巴黎高等电信学院攻读。 Fabrice Bellard&#xff08;个人网站&#xff1a;‌bellard.org‌&#xff09;是计算机领域最具影响力…

USB布局布线

1USB简介 USB是通用串行总线的英文缩写&#xff0c;是连接外部装置的一个串口总线标准&#xff0c;也是一种输入输出接口的技术规范&#xff0c;被广泛地应用于个人电脑和移动设备等信息通迅产品&#xff0c;并扩展到摄影器材&#xff0c;数字电视&#xff08;机顶盒&#xff0…

【数据结构】线性表--链表

【数据结构】线性表--链表 一.前情回顾二.链表的概念三.链表的实现1.链表结点的结构&#xff1a;2.申请新结点函数&#xff1a;3.尾插函数&#xff1a;4.头插函数&#xff1a;5.尾删函数&#xff1a;6.头删函数&#xff1a;7.在指定结点之前插入&#xff1a;8.在指定结点之后插…

Mybatis-plus代码生成器的创建使用与详细解释

Mybatis-plus代码生成器的创建使用与详细解释 一、代码生成器概述 1. 定义(什么是代码生成器) 在软件开发过程中&#xff0c;存在大量重复性的代码编写工作&#xff0c;例如实体类、Mapper 接口、Service 接口及实现类等。代码生成器就是为了解决这类问题而诞生的工具。MyBa…

drawDB:打造高效数据库设计流程

drawDB&#xff1a;打造高效数据库设计流程 drawDB 简介资源链接 核心功能详解1. 直观的实体关系图设计2. SQL 脚本生成3. SQL 导入功能4. 本地化存储与分享功能5. 自定义主题与外观 安装和使用教程本地开发环境搭建构建生产版本Docker 部署基本使用方法 应用场景和实际价值适用…

基于 ESP32 和 GC9D01 0.71寸TFT屏幕的逼真眼睛与写轮眼动态显示

近期&#xff0c;我利用 ESP32 和 GC9D01 0.71’TFT 进行了一次有趣的显示项目开发&#xff0c;成功实现了在该小尺寸屏幕上绘制逼真眼睛和写轮眼的效果。 硬件准备 主控板 &#xff1a;ESP32&#xff0c;具备强大的处理能力和丰富的接口资源&#xff0c;能够高效地处理图像数…

LeetCode58_最后一个单词的长度

LeetCode58_最后一个单词的长度 标签&#xff1a;#字符串Ⅰ. 题目Ⅱ. 示例 0. 个人方法 标签&#xff1a;#字符串 Ⅰ. 题目 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、…

论文阅读:MAXIM Multi-Axis MLP for Image Processing

这是 2022 CVPR 上的一篇文章&#xff0c;介绍了用 MLP 做 low-level 图像处理的工作 Abstract 近年来&#xff0c;Transformer 和多层感知机&#xff08;MLP&#xff09;模型的发展为计算机视觉任务提供了新的网络架构设计。尽管这些模型在图像识别等许多视觉任务中已被证明…

PostgreSQL初试

文章目录 1 PostgreSQL 简介2 PostgreSQL 与 MySQL 的区别3 PostgreSQL 的安装1_Linux部署2_容器化部署 4 PostgreSQL的配置1_远程连接配置2_配置数据库的日志3_设置数据库密码 5 PostgreSQL 基本操作1_用户操作2_权限操作3_创建一个自己的用户4_差异补充 6 安装图形化界面1_使…

Fortran语言,do-end do循环,相互包含测试,自动性能优化

1&#xff09;上代码 !$omp parallel private(n, j, dx, dy, dz, r, a)do n 1, nsteps!$omp dodo i 0, nparticles - 1x_tmp(i) x(i) vx(i) * dty_tmp(i) y(i) vy(i) * dtz_tmp(i) z(i) vz(i) * dtdo j 0, nparticles - 1dx x(j) - x(i)dy y(j) - y(i)dz z(j) - z(…

Cona编译问题

问题描述 Clion 使用conan插件配置了C工程&#xff0c;然后想通过命令行进行编译执行。 出现以下错误 CMake Error at /usr/local/Cellar/cmake/3.30.1/share/cmake/Modules/CMakeDetermineSystem.cmake:152 (message):Could not find toolchain file: conan_toolchain.cmake…

Qt实现 hello world + 内存泄漏(5)

文章目录 实现hello world的两种方式通过图形化的方式通过纯代码的方式1. 新老头文件的说明2.堆或栈上创建对象的选择3.QString的说明 内存泄漏问题 实现hello world的两种方式 通过图形化的方式 通过图形化的方式&#xff0c;在界面上创建出一个控件&#xff0c;显示出hello …

【翻译、转载】【译文】模型上下文协议(Model Context Protocol, MCP)简介

原文地址&#xff1a; https://michaelwapp.medium.com/model-context-protocol-mcp-an-introduction-guide-25736f3dd672 在人工智能和 AI 驱动应用日新月异的格局中&#xff0c;一种与大型语言模型&#xff08;LLM&#xff09;交互的新方式正在兴起。随着 AI 智能体&#x…

[方法论]软件工程中的软件架构设计:从理论到实践的深度解析

文章目录 软件架构设计&#xff1a;从理论到实践的深度解析引言一、软件架构设计的核心目标体系1.1 质量属性矩阵1.2 架构权衡艺术 二、架构设计方法论演进2.1 传统设计范式2.2 现代架构方法论2.3 设计模式演化路径 三、主流架构风格全景图3.1 单体架构&#xff08;Monolithic&…

【win11 】win11 键盘测试

我的键盘是支持mac和win的&#xff0c;fn tab 就能切换&#xff0c;有可能是用错了模式&#xff0c;导致 我alt a 就会弹出 win11的 wifi 等菜单控制 键盘测试网站 https://keyboard.bmcx.com/ 识别到我按下的是alt

Linux环境部署iview-admin项目

环境&#xff1a;阿里云服务 系统&#xff1a;CentOS7.X系统 1、下载源码安装包 wget https://nodejs.org/dist/v14.17.3/node-v14.17.3-linux-x64.tar.xz2、解压并放入指定目录 tar -xf node-v14.17.3-linux-x64.tar.xz && mv node-v14.17.3-linux-x64 /usr/local/no…

VSCode常用插件推荐

文章目录 VSCode常用插件推荐1 Git相关插件2 代码格式3 AI工具4 语言插件通用工具参考 VSCode常用插件推荐 1 Git相关插件 2 代码格式 3 AI工具 4 语言插件 通用工具 参考 50 个 VSCode 必装插件推荐 https://mp.weixin.qq.com/s/b_OKvg3hdavtnv7pbWcKWg

【Unity】使用XLua进行热修复

准备工作&#xff1a; &#xff08;1&#xff09;将XLua的Tool拖入Asset &#xff08;2&#xff09;配置热修复 &#xff08;3&#xff09;运行Genrate Code &#xff08;4&#xff09;运行Hotfix Inject In Editor 编写脚本&#xff08;注意类上带有[Hotfix]&#xff09; [Hot…

javaEE——单例模式

目录 前言1.概念2. 实现3. 比较和改进总结 前言 本篇文章来介绍单例模式&#xff0c;并讲述在保证线程安全的前提下&#xff0c;单例模式的写法。 1.概念 单例模式是一种设计模式&#xff0c;可以说是写代码的一种模板&#xff0c;如果在一些固定的场景下按照设计模式进行写…

TS 对象类型

给对象添加类型注解 ![在这里插入图片描述(https://i-blog.csdnimg.cn/direct/6c413992c11142d88106633ec442b905.png) 格式&#xff1a;数据类型名:类型别名 注意&#xff1a;对象类型限制使用分号&#xff0c;如果对象中存在方法就写成&#xff1a;方法&#xff08;&#x…