# DROP PROPERTY INDEX
Removes a property index.
## Synopsis
DROP PROPERTY INDEX [ IF EXISTS ] index_name [, ... ] [ CASCADE | RESTRICT ]
bold keywords · italic placeholders you supply · [ ] optional · ... repeatable. See Syntax conventions.
## Description
`DROP PROPERTY INDEX` drops one or more indexes created by
[`CREATE PROPERTY INDEX`](create-property-index.md), and nothing else.
- The name is resolved in the graph named by `graph_path`, and **cannot be qualified**. A
name with a schema on it is rejected with `improper property index name`. To drop an index
in another graph, change `graph_path` first.
- Only a property index is accepted. Any other index on the label is refused with
`"" is not property index`: its primary key, an edge label's endpoint indexes, an
index created with SQL.
- `DROP INDEX`, by contrast, takes any index of a label, a property index included, so an
index made by either statement can be dropped by either.
- An index that belongs to a constraint is dropped with the constraint, by
[`DROP CONSTRAINT`](drop-constraint.md).
## Parameters
IF EXISTS
: Issue a notice instead of an error for an index that does not exist. Other names in the
same statement are still dropped.
index_name
: Unqualified name of the property index to drop. Several names may be given, separated by
commas, and they need not be on the same label.
CASCADE
: Drop the objects that depend on the index.
RESTRICT
: Refuse if anything depends on the index. This is the default. An index rarely has
dependents, so the two behave alike most of the time.
## Examples
The examples build their own graph, `unindexed`, rather than using
[the example dataset](../../get_started/example-dataset.md), and drop it at the end.
```cypher
CREATE GRAPH unindexed;
SET graph_path = unindexed;
CREATE VLABEL movie;
CREATE VLABEL person;
CREATE (:movie {title: 'Arrival', year: 2016}), (:person {name: 'Denis Villeneuve'});
CREATE PROPERTY INDEX movie_title_idx ON movie (title);
CREATE PROPERTY INDEX movie_year_idx ON movie (year);
CREATE PROPERTY INDEX person_name_idx ON person (name);
```
```psql
\dGi unindexed.*
```
```
List of property indexes
Graph | LabelName | IndexName | Unique | Owner | Indexdef
-----------+-----------+-----------------+--------+-------+--------------------------------------------------------------------
unindexed | movie | movie_title_idx | f | agens | CREATE PROPERTY INDEX movie_title_idx ON movie USING btree (title)
unindexed | movie | movie_year_idx | f | agens | CREATE PROPERTY INDEX movie_year_idx ON movie USING btree (year)
unindexed | person | person_name_idx | f | agens | CREATE PROPERTY INDEX person_name_idx ON person USING btree (name)
(3 rows)
```
### Drop one index
```cypher
DROP PROPERTY INDEX movie_title_idx;
```
```
DROP PROPERTY INDEX
```
A second attempt is an error, because the index is gone:
```cypher
DROP PROPERTY INDEX movie_title_idx;
```
```
ERROR: index "movie_title_idx" does not exist
```
`IF EXISTS` turns that into a notice:
```cypher
DROP PROPERTY INDEX IF EXISTS movie_title_idx;
```
```
NOTICE: index "movie_title_idx" does not exist, skipping
DROP PROPERTY INDEX
```
### Drop several indexes at once
The names need not belong to the same label:
```cypher
DROP PROPERTY INDEX movie_year_idx, person_name_idx;
```
```
DROP PROPERTY INDEX
```
```psql
\dGi unindexed.*
```
```
No matching property indexes found.
```
### Refusals worth recognizing
The name cannot carry the graph:
```cypher
CREATE PROPERTY INDEX movie_title_idx ON movie (title);
DROP PROPERTY INDEX unindexed.movie_title_idx;
```
```
ERROR: improper property index name
```
An index the statement does not own is refused. A label's primary key is one:
```cypher
DROP PROPERTY INDEX movie_pkey;
```
```
ERROR: "movie_pkey" is not property index
```
`DROP INDEX` takes a property index as well, under its schema-qualified name:
```sql
DROP INDEX unindexed.movie_title_idx;
```
```
DROP INDEX
```
Finally, drop the graph the examples built:
```cypher
DROP GRAPH unindexed CASCADE;
```
## Notes
Because the name is resolved in `graph_path`, an index that exists in another graph reads as
missing rather than as belonging to someone else:
```cypher
CREATE GRAPH oneplace;
SET graph_path = oneplace;
CREATE VLABEL movie;
CREATE PROPERTY INDEX movie_title_idx ON movie (title);
CREATE GRAPH otherplace;
SET graph_path = otherplace;
DROP PROPERTY INDEX movie_title_idx;
```
```
ERROR: index "movie_title_idx" does not exist
```
Two graphs may hold indexes of the same name, so check `\dGi` before assuming which one a
bare name will reach.
```cypher
DROP GRAPH oneplace CASCADE;
DROP GRAPH otherplace CASCADE;
```
To turn a label's indexes off without dropping them, for a bulk load say, use
`ALTER VLABEL ... DISABLE INDEX` and [`REINDEX VLABEL`](reindex.md) instead. That keeps the
definitions and only invalidates them.
## Compatibility
### ISO/IEC 39075 (GQL)
GQL has no index DDL. Its catalog-modifying statements are limited to schemas, graphs and
graph types (§12), so `DROP PROPERTY INDEX` is AgensGraph's own.
### PostgreSQL
`DROP PROPERTY INDEX` corresponds to `DROP INDEX`, and `IF EXISTS`, the name list and
`CASCADE`/`RESTRICT` behave as they do there. It differs in three ways. The name is resolved
in `graph_path` rather than `search_path` and may not be schema-qualified. `CONCURRENTLY` is
not accepted. And the two statements are strictly partitioned: each refuses the other's
indexes, so a property index can only be dropped by this statement.
## See also
- [`CREATE PROPERTY INDEX`](create-property-index.md)
- [`REINDEX VLABEL` and `REINDEX ELABEL`](reindex.md)
- [`DROP CONSTRAINT`](drop-constraint.md)
- [How a graph is stored](../../concepts/graph-on-postgresql.md#what-a-property-index-and-a-constraint-become)