创建索引,Oracle

时间:2016-05-02 14:14:30

标签: sql oracle indexing

我有Oracle数据库。我想创建INDEX:

CREATE INDEX indexID ON Employee(id_employee);

但它写道 - > SQL Error: ORA-01408: such column list already indexed

所以在创建索引之前我把:

DROP INDEX indexID;

但它写道 - > SQL Error: ORA-01418: specified index does not exist

我的员工表:

CREATE TABLE Employee (
  id_employee NUMBER(5) NOT NULL,
  name VARCHAR(25) NOT NULL,
  surname VARCHAR(25) NOT NULL,
  day_of_birth DATE NOT NULL,
  salary NUMBER(6) NOT NULL,

  PRIMARY KEY(id_employee)
);

你有什么想法吗?它看起来像索引不创建。

3 个答案:

答案 0 :(得分:2)

您对该列有不同的索引。 假设你创建这样的表:

SQL> CREATE TABLE Employee (
  2    id_employee NUMBER(5) NOT NULL ,
  3    name VARCHAR(25) NOT NULL,
  4    surname VARCHAR(25) NOT NULL,
  5    day_of_birth DATE NOT NULL,
  6    salary NUMBER(6) NOT NULL
  7  );

Table created.

然后添加PK约束:

SQL> alter table employee add primary key(id_employee);

Table altered.

现在Oracle已经在PK字段上创建了一个唯一索引,因此您已经拥有它,无需手动创建。

SQL> select index_name, column_name
  2  from user_ind_columns c
  3          inner join user_indexes i
  4           using (index_name)
  5  where i.table_name = 'EMPLOYEE';

INDEX_NAME           COLUMN_NAME
-------------------- --------------------
SYS_C007892          ID_EMPLOYEE

在你的例子中:

SQL> CREATE TABLE Zamestnanec (
  2    id_zamestnance NUMBER(5) PRIMARY KEY ,
  3    jmeno VARCHAR(25) NOT NULL,
  4    prijmeni VARCHAR(25) NOT NULL,
  5    datum_narozeni DATE NOT NULL,
  6    prava CHAR(3) CHECK(prava IN ('ano', 'ne')) NOT NULL,
  7    plat NUMBER(6) NOT NULL
  8  );

Table created.

SQL> select index_name, column_name
  2  from user_ind_columns c
  3          inner join user_indexes i
  4           using (index_name)
  5  where i.table_name = 'ZAMESTNANEC';

INDEX_NAME           COLUMN_NAME
-------------------- --------------------
SYS_C007899          ID_ZAMESTNANCE

我略微修改了你的语法;此外,您可以避免PK字段上的NOT NULL约束:PK将强制该字段为NOT NULL

有关类似问题,请参阅here

答案 1 :(得分:1)

我会建议一个奇怪的解决方案,但我向你保证它会起作用。

  1. 从表中删除主键约束。

    ALTER TABLE Employee 
    DROP CONSTRAINT pk_id_employee
    
  2. 删除索引,然后......

  3. 创建主键约束

答案 2 :(得分:1)

ZAMESTNANEC的CREATE TABLE是

CREATE TABLE Zamestnanec (
  id_zamestnance NUMBER(5) NOT NULL,
  jmeno VARCHAR(25) NOT NULL,
  prijmeni VARCHAR(25) NOT NULL,
  datum_narozeni DATE NOT NULL,
  prava CHAR(3) CHECK(prava IN ('ano', 'ne')) NOT NULL,
  plat NUMBER(6) NOT NULL,

  PRIMARY KEY(id_zamestnance)
);

您已为ID_ZAMESTNANCE创建了主键约束,默认情况下会在ID_ZAMESTNANCE上创建索引;因此,您不需要在ID_ZAMESTNANCE上创建另一个索引。