SQL
Primary Key and Unique Constraint
Primary key or unique constraints define a column, or set of columns, that are a unique identifier for a row in the table. The constraint enforces that the specified columns are *unique* within a table, i.e., that at most one row contains the given values for the set of columns.  
```sql
CREATE TABLE students (id INTEGER PRIMARY KEY, name VARCHAR);
INSERT INTO students VALUES (1, 'Student 1');
INSERT INTO students VALUES (1, 'Student 2');
```  
```console
Constraint Error: Duplicate key "id: 1" violates primary key constraint
```  
```sql
CREATE TABLE students (id INTEGER, name VARCHAR, PRIMARY KEY (id, name));
INSERT INTO students VALUES (1, 'Student 1');
INSERT INTO students VALUES (1, 'Student 2');
INSERT INTO students VALUES (1, 'Student 1');
```  
```console
Constraint Error: Duplicate key "id: 1, name: Student 1" violates primary key constraint
```  
In order to enforce this property efficiently, an [ART index is automatically created](#docs:sql:indexes) for every primary key or unique constraint that is defined in the table.  
Primary key constraints and unique constraints are identical except for two points:  
* A table can only have one primary key constraint defined, but many unique constraints
* A primary key constraint also enforces the keys to not be `NULL`.  
```sql
CREATE TABLE students(id INTEGER PRIMARY KEY, name VARCHAR, email VARCHAR UNIQUE);
INSERT INTO students VALUES (1, 'Student 1', 'student1@uni.com');
INSERT INTO students values (2, 'Student 2', 'student1@uni.com');
```  
```console
Constraint Error: Duplicate key "email: student1@uni.com" violates unique constraint.
```  
```sql
INSERT INTO students(id, name) VALUES (3, 'Student 3');
INSERT INTO students(name, email) VALUES ('Student 3', 'student3@uni.com');
```  
```console
Constraint Error: NOT NULL constraint failed: students.id
```  
> **Warning.  ** Indexes have certain limitations that might result in constraints being evaluated too eagerly, leading to constraint errors such as `violates primary key constraint` and `violates unique constraint`. See the [indexes section for more details](#docs:sql:indexes::index-limitations).