# SQL, Unique and Primary keys

> Learn how to use the UNIQUE constraint to stop duplicate values in a SQL column, and how a PRIMARY KEY uniquely identifies each row in a table.

Author: [Flavio Copes](https://flaviocopes.com/about/) | Published: 2020-03-30 | Topics: [Database](https://flaviocopes.com/tags/database/) | Canonical: https://flaviocopes.com/sql-unique-primary-keys/

With a table created with this command:

```sql
CREATE TABLE people (
  age INT NOT NULL,
  name CHAR(20) NOT NULL
);
```

We can insert an item more than once. 

And in particular, we can have columns that repeat the same value.

We can force a column to have only unique values using the `UNIQUE` key constraint:

```sql
CREATE TABLE people (
  age INT NOT NULL,
  name CHAR(20) NOT NULL UNIQUE
);
```

Now if you try to add the 'Flavio' twice:

```sql
INSERT INTO people VALUES (37, 'Flavio');
INSERT INTO people VALUES (20, 'Flavio');
```

You'd get an error:

```
ERROR:  duplicate key value violates unique constraint "people_name_key"
DETAIL:  Key (name)=(Flavio) already exists.
```

A **primary key** is a unique key that has another property: it's the primary way we identify a row in the table.

```sql
CREATE TABLE people (
  age INT NOT NULL,
  name CHAR(20) NOT NULL PRIMARY KEY
);
```

The primary key can be an email in a list of users, for example.

The primary key can be a unique `id` that we assign to each record automatically.

Whatever that value is, we know we can use it to reference a row in the table.

Unique and primary keys are backed by indexes under the hood. If you're wondering which other columns in your queries deserve an index, I built a free [index advisor](https://flaviocopes.com/tools/index-advisor/) that suggests the right `CREATE INDEX` statement.
