PCA9422与STM32F405RG的I2C电源管理实战:动态调压与低功耗设计
2026/10/10 5:35:35
说明:本章内容基于 Oracle Database。以下为在 Windows 或 Linux 上安装 Oracle Database 的基本步骤(以 Oracle 21c Express Edition 为例)。
OracleXE213_Win64.exeoracle123)OracleServiceXEOracleXETNSListener使用 SQL*Plus 或 SQL Developer 连接:
# 使用 sqlplus 命令行sqlplus sys/oracle123@localhost:1521/XE as sysdba或创建普通用户(推荐):
-- 创建表空间(可选)CREATETABLESPACEusers_ts DATAFILE'users_ts.dbf'SIZE100M AUTOEXTENDON;-- 创建用户CREATEUSERhr IDENTIFIEDBYhr123DEFAULTTABLESPACEusers_ts;-- 授予权限GRANTCONNECT,RESOURCE,CREATEVIEWTOhr;然后用hr/hr123登录进行练习。
hr.employees。CREATETABLE[schema.]table_name(column_name datatype[DEFAULTexpr][column_constraint],...[table_constraint])[TABLESPACEtablespace_name];-- 创建 employees 表CREATETABLEemployees(emp_id NUMBER(6)PRIMARYKEY,-- 主键约束first_name VARCHAR2(20),-- 可为空last_name VARCHAR2(25)NOTNULL,-- 非空约束email VARCHAR2(30)UNIQUE,-- 唯一性约束phone VARCHAR2(20),hire_dateDATEDEFAULTSYSDATE,-- 默认当前日期job_id VARCHAR2(10),salary NUMBER(8,2)CHECK(salary>0),-- 检查约束(隐式)manager_id NUMBER(6),dept_id NUMBER(4));注释:
VARCHAR2是 Oracle 推荐的变长字符串类型。DEFAULT SYSDATE表示若未提供值,则自动填入系统当前日期。CHECK约束确保工资大于 0。
可通过USER_SEGMENTS查看:
SELECTsegment_name,segment_type,bytes/1024/1024ASsize_mbFROMuser_segmentsWHEREsegment_name='EMPLOYEES';-- 添加奖金字段ALTERTABLEemployeesADD(bonus NUMBER(8,2));-- 删除 phone 字段ALTERTABLEemployeesDROPCOLUMNphone;⚠️ 注意:删除字段不可逆,且可能影响性能(标记删除,后续清理)。
-- 修改 salary 精度,并设默认值ALTERTABLEemployeesMODIFY(salary NUMBER(10,2)DEFAULT5000.00);-- 修改字段为非空ALTERTABLEemployeesMODIFY(first_name VARCHAR2(20)NOTNULL);-- 重命名表RENAMEemployeesTOemp_info;-- 或ALTERTABLEemp_infoRENAMETOemployees;-- 移动表到新表空间ALTERTABLEemployees MOVETABLESPACEusers_ts;-- 修改存储参数(需启用 row movement)ALTERTABLEemployees MOVE PCTFREE20INITTRANS4;-- 普通删除(可闪回)DROPTABLEemployees;-- 彻底删除(不可恢复)DROPTABLEemployeesPURGE;-- 闪回恢复(如果未 purge)FLASHBACKTABLEemployeesTOBEFOREDROP;-- 设置为只读ALTERTABLEemployeesREADONLY;-- 恢复为读写ALTERTABLEemployeesREADWRITE;约束用于保证数据的准确性与一致性。
-- 创建时定义CREATETABLEtest_notnull(id NUMBER,name VARCHAR2(20)NOTNULL);-- 或通过修改添加(需先确保无空值)ALTERTABLEemployeesMODIFY(last_name VARCHAR2(25)NOTNULL);-- 创建表时定义CREATETABLEdepartments(dept_id NUMBER(4)PRIMARYKEY,dept_name VARCHAR2(30)NOTNULL);-- 或单独添加ALTERTABLEemployeesADDCONSTRAINTemp_pkPRIMARYKEY(emp_id);ALTERTABLEemployeesADDCONSTRAINTemp_email_ukUNIQUE(email);-- 先确保主表存在CREATETABLEdepartments(dept_id NUMBER(4)PRIMARYKEY,dept_name VARCHAR2(30));-- 在 employees 中添加外键ALTERTABLEemployeesADDCONSTRAINTemp_dept_fkFOREIGNKEY(dept_id)REFERENCESdepartments(dept_id)ONDELETESETNULL;-- 或 CASCADE / NO ACTION(默认)外键选项说明:
ON DELETE CASCADE:主表删除,从表级联删除。ON DELETE SET NULL:主表删除,从表字段设为 NULL(要求字段可为空)。
-- 禁用外键约束(常用于大批量导入)ALTERTABLEemployeesDISABLECONSTRAINTemp_dept_fk;-- 激活约束(会验证现有数据)ALTERTABLEemployeesENABLECONSTRAINTemp_dept_fk;-- 启用但不验证已有数据(需谨慎)ALTERTABLEemployeesENABLENOVALIDATECONSTRAINTemp_dept_fk;-- 删除约束(保留列)ALTERTABLEemployeesDROPCONSTRAINTemp_email_uk;-- 删除主键(同时删除唯一索引)ALTERTABLEemployeesDROPPRIMARYKEY;-- 创建部门表CREATETABLEdepartments(dept_id NUMBER(4)PRIMARYKEY,dept_name VARCHAR2(30)NOTNULL,location VARCHAR2(50));-- 创建员工表(暂不加外键)CREATETABLEemployees(emp_id NUMBER(6),first_name VARCHAR2(20),last_name VARCHAR2(25)NOTNULL,email VARCHAR2(30),hire_dateDATEDEFAULTSYSDATE,salary NUMBER(8,2)CHECK(salary>0),dept_id NUMBER(4));-- 添加主键ALTERTABLEemployeesADDCONSTRAINTemp_pkPRIMARYKEY(emp_id);-- 添加唯一约束ALTERTABLEemployeesADDCONSTRAINTemp_email_ukUNIQUE(email);-- 添加外键(引用 departments)ALTERTABLEemployeesADDCONSTRAINTemp_dept_fkFOREIGNKEY(dept_id)REFERENCESdepartments(dept_id)ONDELETESETNULL;-- 插入部门INSERTINTOdepartmentsVALUES(10,'HR','Beijing');INSERTINTOdepartmentsVALUES(20,'IT','Shanghai');-- 插入员工INSERTINTOemployees(emp_id,first_name,last_name,email,salary,dept_id)VALUES(101,'Alice','Smith','alice@example.com',8000,10);INSERTINTOemployees(emp_id,first_name,last_name,email,salary,dept_id)VALUES(102,'Bob','Lee','bob@example.com',9000,20);-- 增加字段ALTERTABLEemployeesADD(commission_pct NUMBER(2,2));-- 修改字段默认值ALTERTABLEemployeesMODIFY(commission_pctDEFAULT0.1);-- 尝试插入违反外键的数据(会失败)-- INSERT INTO employees VALUES (103, 'Tom', 'King', 'tom@example.com', SYSDATE, 7000, 99); -- 错误!dept_id=99 不存在-- 禁用外键(假设要导入历史数据)ALTERTABLEemployeesDISABLECONSTRAINTemp_dept_fk;-- 插入无效 dept_id(临时允许)INSERTINTOemployees(emp_id,first_name,last_name,email,salary,dept_id)VALUES(103,'Charlie','Brown','charlie@example.com',6000,99);-- 修复数据或删除无效行DELETEFROMemployeesWHEREdept_id=99;-- 重新启用约束ALTERTABLEemployeesENABLECONSTRAINTemp_dept_fk;-- 删除表(放入回收站)DROPTABLEemployees;-- 查看回收站SHOWRECYCLEBIN;-- 闪回恢复FLASHBACKTABLEemployeesTOBEFOREDROP;-- 重命名恢复后的表(如果名字冲突)FLASHBACKTABLE"BIN$...$"TOBEFOREDROPRENAMETOemployees_old;| 操作类型 | 关键语法 |
|---|---|
| 创建表 | CREATE TABLE ... |
| 增加字段 | ALTER TABLE ... ADD (...) |
| 修改字段 | ALTER TABLE ... MODIFY (...) |
| 删除字段 | ALTER TABLE ... DROP COLUMN ... |
| 重命名表 | RENAME old TO new |
| 添加主键 | ADD CONSTRAINT pk PRIMARY KEY (...) |
| 添加外键 | ADD CONSTRAINT fk FOREIGN KEY (...) REFERENCES ... |
| 禁用约束 | ALTER TABLE ... DISABLE CONSTRAINT ... |
| 删除表 | DROP TABLE ... [PURGE] |
| 闪回表 | FLASHBACK TABLE ... TO BEFORE DROP |
最佳实践建议:
- 所有约束命名(如
emp_pk),便于管理。- 生产环境避免频繁
DROP COLUMN。- 大批量数据操作前,考虑禁用约束并事后验证。
- 使用
PURGE谨慎,避免无法恢复。
如有进一步需求(如分区表、物化视图、索引组织表等高级特性),可继续扩展本章内容。