Apache Derby 简明教程
Apache Derby - Derby Indexes
在执行以上程序时,将生成以下输出:
表格中的索引只不过是其数据的指针。这些用于加速从表格中检索数据。
Creating an Index
如果我们使用索引,则 INSERT 和 UPDATE 语句将以较慢的速度执行。而 SELECT 和 WHERE 将在较短的时间内执行。CREATE INDEX 语句用于在 Derby 数据库中表格内创建新索引。
Example
假设我们创建了一个名为 Employees 的 Apache Derby 表,如下所示。
CREATE TABLE Emp ( Id INT NOT NULL GENERATED ALWAYS AS IDENTITY,
Name VARCHAR(255),
Salary INT NOT NULL,
Location VARCHAR(255),
Phone_Number BIGINT
);
以下 SQL 语句在表 Employees 中名为 Salary 的列上创建了一个索引。
ij> CREATE INDEX example_index on Emp (Salary);
0 rows inserted/updated/deleted
Creating a UNIQUE index
在 Apache Derby 中,UNIQUE 索引用于数据集成。一旦在表中的列上创建了 UNIQUE 索引,不允许出现重复值。
Example
以下示例在表 Employee 的 Id 列上创建了一个 UNIQUE 索引。
ij> CREATE UNIQUE INDEX unique_index on Emp (Phone_Number);
0 rows inserted/updated/deleted
一旦您在某列上创建了唯一索引,您就不能为该列在另一行中输入相同的值。简而言之,具有 UNIQUE 索引的列不允许出现重复值。
如下所示,在 Emp 表中插入一行。
ij> INSERT INTO Emp(Name, Salary, Location, Phone_Number) VALUES
('Amit', 45000, 'Hyderabad', 9848022338);
1 row inserted/updated/deleted
由于我们在列 Phone_No 上创建了唯一索引,如果您尝试输入与前一个记录中的相同值,它将显示错误。
ij> INSERT INTO Emp(Name, Salary, Location, Phone_Number) VALUES
('Sumit', 35000, 'Chennai', 9848022338);
ERROR 23505: The statement was aborted because it would have caused a duplicate
key value in a unique or primary key constraint or unique index identified by
'UNIQUE_INDEX' defined on 'EMP'.
Displaying the Indexes
SHOW INDEXES 查询显示表上的索引列表。
Example
以下示例 i 显示表 Employees 上的索引。
ij> SHOW INDEXES FROM Emp;
这将产生以下结果。
ij> SHOW INDEXES FROM Emp;
TABLE_NAME |COLUMN_NAME |NON_U&|TYPE|ASC&|CARDINA&|PAGES
----------------------------------------------------------------------------
EMP |PHONE_NUMBER|false |3 |A |NULL |NULL
EMP |NAME |true |3 |A |NULL |NULL
EMP |LOCATION |true |3 |A |NULL |NULL
EMP |SALARY |true |3 |A |NULL |NULL
4 rows selected
Dropping Indexes
Drop Index 语句会删除/放弃某个列上的给定索引。
Example
以下示例放弃了上面创建的 composite_index 和 unique_index。
ij> DROP INDEX composite_index;
0 rows inserted/updated/deleted
ij>Drop INDEX unique_index;
0 rows inserted/updated/deleted
现在,如果您验证索引列表,您可以看到一列上的索引,因为我们删除了剩余的索引。
ij> SHOW INDEXES FROM Emp;
TABLE_NAME |COLUMN_NAME |NON_U&|TYPE|ASC&|CARDINA&|PAGES
----------------------------------------------------------------------------
EMP |SALARY |true |3 |A |NULL |NULL
1 row selected
Handling Indexes using JDBC program
以下 JDBC 程序演示如何删除表中一列上的索引。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class IndexesExample {
public static void main(String args[]) throws Exception {
//Registering the driver
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
//Getting the Connection object
String URL = "jdbc:derby:MYDATABASE;create=true";
Connection conn = DriverManager.getConnection(URL);
//Creating the Statement object
Statement stmt = conn.createStatement();
//Creating the Emp table
String createQuery = "CREATE TABLE Emp( "
+ "Id INT NOT NULL GENERATED ALWAYS AS IDENTITY, "
+ "Name VARCHAR(255), "
+ "Salary INT NOT NULL, "
+ "Location VARCHAR(255), "
+ "Phone_Number BIGINT )";
stmt.execute(createQuery);
System.out.println("Table created");
System.out.println(" ");
//Creating an Index on the column Salary
stmt.execute("CREATE INDEX example_index on Emp (Salary)");
System.out.println("Index example_index inserted");
System.out.println(" ");
//Creating an Unique index on the column Phone_Number
stmt.execute("CREATE UNIQUE INDEX unique_index on Emp (Phone_Number)");
System.out.println("Index unique_index inserted");
System.out.println(" ");
//Creating a Composite Index on the columns Name and Location
stmt.execute("CREATE INDEX composite_index on Emp (Name, Location)");
System.out.println("Index composite_index inserted");
System.out.println(" ");
//listing all the indexes
System.out.println("Listing all the columns with indexes");
//Dropping indexes
System.out.println("Dropping indexes unique_index and, composite_index ");
stmt.execute("Drop INDEX unique_index");
stmt.execute("DROP INDEX composite_index");
}
}