Kodokon kodokon.com

Crear un esquema: CREATE TABLE y restricciones

Diseña tus propias tablas con tipos adecuados y restricciones NOT NULL, UNIQUE y PRIMARY KEY que protegen tus datos.

8 min · 3 preguntas

Abrir esta lección en Kodokon

Hasta ahora consultabas tablas ya hechas; un desarrollador profesional las diseña. Un buen esquema rechaza los datos inválidos en el momento de la inserción: es tu primera línea de defensa, antes de cualquier código de aplicación. En sqliteonline.com o sqlite3, crea esta tabla:

SQL
CREATE TABLE users (
  id INTEGER PRIMARY KEY,
  email TEXT NOT NULL UNIQUE,
  username TEXT NOT NULL UNIQUE,
  created_at TEXT NOT NULL
    DEFAULT (datetime('now'))
);
Tres restricciones: NOT NULL, UNIQUE y un valor por defecto.

SQLite solo conoce cinco tipos de almacenamiento: INTEGER, REAL, TEXT, BLOB y NULL. Las fechas se almacenan ahí como TEXT en formato ISO (2026-07-04). En otros sistemas (PostgreSQL, MySQL), declararías en su lugar VARCHAR(255), TIMESTAMP o BOOLEAN: el principio sigue siendo el mismo, solo cambian los nombres de los tipos. Ahora prueba tus restricciones:

SQL
INSERT INTO users (email, username)
VALUES ('alice@example.com', 'alice');

INSERT INTO users (email, username)
VALUES ('alice@example.com', 'alice2');
La segunda inserción falla: UNIQUE constraint failed.

La clave primaria identifica cada fila: nunca NULL, nunca duplicada, solo una por tabla. En SQLite, INTEGER PRIMARY KEY tiene una característica valiosa: la columna se autoincrementa cuando omites su valor, como en las inserciones anteriores. En PostgreSQL escribirías GENERATED ALWAYS AS IDENTITY, en MySQL AUTO_INCREMENT. Por último, añade una regla de negocio con CHECK:

SQL
CREATE TABLE products (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  sku TEXT NOT NULL UNIQUE,
  price REAL NOT NULL CHECK (price >= 0)
);

INSERT INTO products (name, sku, price)
VALUES ('Keyboard', 'KB-01', -5);
Rechazado: CHECK constraint failed. Ningún precio negativo pasará.

Prueba de conocimientos

Comprueba que has retenido los puntos clave de esta lección.

  1. ¿Qué restricción garantiza que no aparezca ningún duplicado en la columna email?
    • NOT NULL
    • UNIQUE
    • CHECK
    • DEFAULT
  2. ¿Cuál es la diferencia entre PRIMARY KEY y UNIQUE?
    • Ninguna, son sinónimos
    • La clave primaria identifica la fila: solo una por tabla, nunca NULL
    • UNIQUE es más estricto que PRIMARY KEY
  3. En SQLite, ¿qué ocurre si insertas una fila sin valor para una columna INTEGER PRIMARY KEY?
    • Se lanza un error NOT NULL
    • SQLite genera automáticamente un entero único
    • La columna queda en NULL