Diseña tus propias tablas con tipos adecuados y restricciones NOT NULL, UNIQUE y PRIMARY KEY que protegen tus datos.
Abrir esta lección en KodokonHasta 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:
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'))
);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:
INSERT INTO users (email, username)
VALUES ('alice@example.com', 'alice');
INSERT INTO users (email, username)
VALUES ('alice@example.com', 'alice2');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:
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);