我有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)
);
你有什么想法吗?它看起来像索引不创建。
答案 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)
我会建议一个奇怪的解决方案,但我向你保证它会起作用。
从表中删除主键约束。
ALTER TABLE Employee
DROP CONSTRAINT pk_id_employee
删除索引,然后......
答案 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
上创建另一个索引。