iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more
Una PRIMARY KEY identifica una fila; UNIQUE impide que se repita un valor o combinación de valores; y una FOREIGN KEY comprueba que una referencia apunte a una fila válida. En Django, esas ideas se expresan con primary_key=True, unique=True y ForeignKey, respectivamente. Aunque están relacionadas, no son intercambiables: cada una protege una regla distinta.
Qué hace cada restricción
| Restricción | Qué garantiza | ¿Identifica o relaciona? | En Django |
|---|---|---|---|
PRIMARY KEY |
Valores únicos y no nulos para una columna o un conjunto de columnas | Identifica filas | primary_key=True |
UNIQUE |
Que no se repita un valor o una combinación de valores | Protege una regla de unicidad; no designa por sí sola la identidad principal de la fila | unique=True en un campo; también hay restricciones de modelo para casos compuestos |
FOREIGN KEY |
Que un valor referenciante corresponda a un valor permitido en la tabla destino | Relaciona filas entre tablas | ForeignKey(ModeloDestino, on_delete=...) |
En PostgreSQL 18, una tabla puede tener como máximo una clave primaria, que puede incluir una o varias columnas. PostgreSQL crea automáticamente un índice único para respaldarla. Una tabla sí puede tener varias restricciones UNIQUE. Para una clave foránea, PostgreSQL exige que las columnas referenciadas estén respaldadas por una clave primaria, una restricción única o un índice único no parcial. Documentación de restricciones de PostgreSQL.
Primary key: la identidad de la fila
Una clave primaria marca qué columna —o conjunto de columnas— permite identificar de manera inequívoca cada fila. Sus valores no pueden repetirse ni ser NULL. Por ejemplo, producto_id puede identificar cada producto aunque el nombre o el código visible cambien.
La clave primaria también puede ser compuesta: la identidad depende entonces de la combinación de columnas, no de cada valor aislado. En PostgreSQL, la regla sigue siendo una clave primaria por tabla, aunque abarque varias columnas.
#1 Best Overall
UNIQUE: una regla contra duplicados
UNIQUE sirve para una regla de negocio que prohíbe duplicados, como un código de producto. No convierte automáticamente la columna en la identidad principal de la fila: una tabla puede tener varias reglas UNIQUE, pero solo una clave primaria en PostgreSQL.
No asumas que UNIQUE significa «obligatorio». Si el campo debe tener un valor, declara también una regla de no nulidad. El tratamiento de valores NULL en restricciones únicas depende del motor de base de datos y, en algunos casos, de su configuración.
Foreign key: una referencia válida
Una clave foránea impide que una fila apunte a un registro inexistente, según las reglas del motor. No impide por sí misma que varias filas de la tabla de origen apunten al mismo registro: por eso, una relación de muchos a uno puede tener muchas filas que referencien el mismo producto.
Si una relación debe ser obligatoria, la columna necesita además una regla de no nulidad. Una clave foránea nullable puede quedar sin referencia; la restricción de referencia no equivale a exigir que el campo siempre tenga un valor.
Ejemplo SQL: productos y pedidos
CREATE TABLE productos (
producto_id integer PRIMARY KEY,
codigo text UNIQUE NOT NULL
);
CREATE TABLE pedidos (
pedido_id integer PRIMARY KEY,
producto_id integer REFERENCES productos (producto_id)
);
productos.producto_ididentifica cada producto y no admite duplicados ni valores nulos.productos.codigono puede repetirse. En este ejemplo,NOT NULLse declara por separado porqueUNIQUEno expresa por sí solo que el campo sea obligatorio.pedidos.producto_iddebe referenciar un producto existente, pero puede quedar sin valor mientras la columna admitaNULL. Para exigir una referencia, habría que declarar tambiénNOT NULL.
Cómo se expresan estas reglas en Django
from django.db import models
class Producto(models.Model):
codigo = models.CharField(max_length=40, unique=True)
class Pedido(models.Model):
producto = models.ForeignKey(Producto, on_delete=models.PROTECT)
En este ejemplo, codigo debe ser único. producto representa una relación muchos-a-uno y, de forma predeterminada, Django suele crear para ella una columna llamada producto_id y un índice. PROTECT ilustra una elección explícita para el borrado; la opción adecuada depende de las reglas de la aplicación y de qué debe pasar con los pedidos si se intenta borrar un producto.
Por qué Django añade un campo id
Si un modelo no define una clave primaria, Django agrega una automáticamente. Si necesitas elegir otro campo como identidad, puedes marcarlo con primary_key=True. Django documenta que esa opción implica null=False y unique=True, y que solo un campo puede marcarse así. En Django 5.2, las claves primarias compuestas se declaran con CompositePrimaryKey. Consulta la referencia oficial de campos de modelo de Django 5.2.
Rank #4
Qué significa on_delete en Django
El argumento on_delete determina cómo Django emula la conducta elegida cuando se borran objetos mediante sus operaciones. No crea por sí mismo una cláusula SQL ON DELETE en la base de datos. Por eso, on_delete=models.CASCADE no demuestra que el motor tenga configurado SQL ON DELETE CASCADE; son comportamientos que conviene distinguir al diseñar borrados y evaluar operaciones realizadas fuera del ORM.
Crashes, No Sound, or Screen Glitches?
Random freezes, missing sound and display glitches usually trace back to one bad driver. Find and replace yours safely.Free scan · under a minutePC Slower Than It Used to Be?
A free scan shows the junk files, broken settings and background clutter dragging Windows down - then fixes them in one click.Free scan · Windows 10 & 11Quick Recap
Best Value
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

