【问题标题】:create index, Oracle创建索引,甲骨文
【发布时间】:2016-05-02 14:14:30
【问题描述】:

我有 Oracle 数据库。我想创建索引:

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)
);

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

【问题讨论】:

  • 您有一个具有不同名称的索引,但定义了相同的列。在 Oracle(12c 之前)中,即使名称不同,也不能有两个具有相同列列表的索引。您可以运行select index_name from user_indexes where table_name = 'EMPLOYEE' 来找出该表的现有索引名称。
  • 供将来参考 - 不要担心将捷克语表和字段名称翻译成英文。发布您所拥有的 - 名称并不重要,它们只是文本字符串。谢谢。
  • 感谢 bob jarvis,对我有好处:D

标签: sql oracle indexing


【解决方案1】:

您在该列上有不同的索引。 假设您像这样创建表:

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 了解类似问题。

【讨论】:

  • 我尝试了你的代码,但它写道:没有选择任何行sooooo,如果我得到它,id_employee 已经是索引,所以我尝试在已经存在的索引上创建索引
  • 你是如何创建表格的?可以发一下代码吗?
  • 对不起,我用捷克语写代码,所以员工是 Zamestnanec,id_employee 是 id_zamestnanec,创建索引几乎在代码末尾pastebin.com/Z6NVDSQP
  • 如果表中已经加载了数据,这将不起作用
  • @piyushjaiswal:我们正在创建一个表,所以我假设它是 emply
【解决方案2】:

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 上创建另一个索引。

【讨论】:

    【解决方案3】:

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

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

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

    3. 创建主键约束

    【讨论】:

    • 很高兴它成功了,请标记为已解决,谢谢
    猜你喜欢
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多