Derby命令是Apache Derby数据库管理系统的核心组成部分,它提供了丰富的命令集用于数据库的创建、表管理、数据操作、权限控制等多个方面,Apache Derby是一个纯Java编写的嵌入式数据库,支持JDBC驱动,因此其命令既可以嵌入到Java应用程序中执行,也可以通过命令行工具ij进行交互式操作,以下将详细介绍Derby命令的分类、功能及使用方法。

Derby命令主要分为三类:系统命令、SQL命令和ij工具命令,系统命令通常以ij开头,用于控制ij工具的行为;SQL命令遵循SQL标准,用于数据库对象的定义和数据操作;而ij工具命令则用于连接数据库、执行脚本等辅助操作,理解这三类命令的区别是高效使用Derby的关键。
系统命令主要用于ij工具的配置和管理。ij命令本身用于启动ij工具,而connect命令用于建立与Derby数据库的连接,连接语法为connect 'jdbc:derby:数据库路径[;属性=值]',其中数据库路径可以是嵌入式模式(如jdbc:derby:testdb)或网络服务器模式(如jdbc:derby://localhost:1527/testdb),其他常用系统命令包括autocommit(控制自动提交模式)、verbose(设置详细输出级别)和run(执行SQL脚本文件)。autocommit off可以关闭自动提交功能,使事务操作更加可控。
SQL命令是Derby命令的主体,涵盖了数据定义语言(DDL)、数据操作语言(DML)、数据控制语言(DCL)等,DDL命令用于管理数据库对象,如CREATE TABLE用于创建表,ALTER TABLE用于修改表结构,DROP TABLE用于删除表,创建表时可以指定列名、数据类型(如VARCHAR、INTEGER、TIMESTAMP等)、约束条件(如PRIMARY KEY、FOREIGN KEY、NOT NULL等)。CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(100) UNIQUE),DML命令用于操作表数据,包括INSERT、UPDATE、DELETE和SELECT。INSERT语句用于向表中插入数据,可以指定列名或按列顺序插入值;UPDATE语句用于修改已有数据,通常需要配合WHERE子句限定条件;DELETE语句用于删除数据,同样需要WHERE子句避免误删全表数据;SELECT语句是查询数据的核心,支持JOIN、GROUP BY、HAVING等复杂查询操作。SELECT * FROM users WHERE age > 30 ORDER BY name DESC。
Derby还支持事务控制命令,如COMMIT和ROLLBACK,当autocommit关闭时,显式使用COMMIT提交事务或ROLLBACK回滚事务可以确保数据的一致性,Derby提供了SAVEPOINT命令用于设置事务保存点,允许部分回滚操作。SAVEPOINT sp1; UPDATE accounts SET balance = balance - 100; ROLLBACK TO SAVEPOINT sp1;。

在表管理方面,Derby支持索引的创建和删除以提高查询性能。CREATE INDEX命令可以为表的指定列创建索引,如CREATE INDEX idx_users_email ON users(email);DROP INDEX命令则用于删除索引,视图的创建通过CREATE VIEW命令实现,视图是基于表的虚拟表,可以简化复杂查询并隐藏数据细节。CREATE VIEW active_users AS SELECT * FROM users WHERE status = 'active'。
权限控制是数据库管理的重要部分,Derby通过GRANT和REVOKE命令管理用户权限。GRANT命令可以将特定权限(如SELECT、INSERT、UPDATE、DELETE等)授予用户或角色,GRANT SELECT ON users TO user1;REVOKE命令则用于撤销已授予的权限,Derby还支持用户和角色的创建与管理,如CREATE USER和CREATE ROLE命令。
Derby的网络服务器模式允许远程客户端连接,此时需要启动Derby Network Server,并通过jdbc:derby://localhost:1527/dbname格式连接,在嵌入式模式下,数据库与应用程序运行在同一个JVM中,连接路径直接指向数据库目录,在Java代码中加载Derby驱动并建立连接:Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); Connection conn = DriverManager.getConnection("jdbc:derby:testdb;create=true");。
以下表格总结了常用的Derby SQL命令及其功能:

| 命令类型 | 命令语法 | 功能描述 |
|---|---|---|
| DDL | CREATE TABLE table_name (column definitions) | 创建新表 |
| DDL | ALTER TABLE table_name ADD/MODIFY column_name | 修改表结构 |
| DDL | DROP TABLE table_name | 删除表 |
| DML | INSERT INTO table_name (columns) VALUES (values) | 插入数据 |
| DML | UPDATE table_name SET column = value WHERE condition | 更新数据 |
| DML | DELETE FROM table_name WHERE condition | 删除数据 |
| DML | SELECT columns FROM table_name WHERE condition | 查询数据 |
| 事务 | COMMIT | 提交当前事务 |
| 事务 | ROLLBACK | 回滚当前事务 |
| 索引 | CREATE INDEX index_name ON table_name (column) | 创建索引 |
| 权限 | GRANT permission ON table_name TO user | 授予权限 |
| 权限 | REVOKE permission ON table_name FROM user | 撤销权限 |
在使用Derby命令时,需要注意以下几点:嵌入式模式下数据库的生命周期与应用程序绑定,关闭应用程序时会自动关闭数据库;网络服务器模式需要手动启动服务器,并通过derbystart命令或Java代码启动;Derby支持SQL标准,但某些高级功能可能需要特定的语法支持,如GENERATED ALWAYS AS IDENTITY用于自增主键。
Derby命令的灵活性和强大功能使其适用于小型应用、嵌入式系统和开发测试环境,通过合理运用DDL、DML和事务控制命令,可以高效管理数据库结构和数据,结合ij工具的交互式操作和Java JDBC编程,可以实现复杂的数据库应用开发。
相关问答FAQs
Q1: 如何在Derby中创建一个带有自增主键的表?
A1: 在Derby中,可以使用GENERATED ALWAYS AS IDENTITY子句创建自增主键。
CREATE TABLE products (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name VARCHAR(100),
price DECIMAL(10,2)
);
插入数据时无需指定id列,Derby会自动生成唯一值:INSERT INTO products (name, price) VALUES ('Laptop', 999.99);。
Q2: Derby如何处理并发事务?
A2: Derby支持标准的事务隔离级别,包括READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE,默认隔离级别为READ COMMITTED,可以通过以下语句设置隔离级别:
VALUES SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.storage.locks.waitTimeout', '10');
Derby使用乐观并发控制(OCC)和锁机制管理并发,通过SELECT ... FOR UPDATE锁定行,避免冲突。
