Guía rápida de sql CREATE TABLE

En la anterior entrada aprendimos a crear una base de datos por medio de una consulta, pero una base de datos sin contenido no tiene sentido, y para guardar los datos necesitamos crear nuestras tablas por medio del comando CREATE TABLE, donde luego insertaríamos datos por medio del comando INSERT INTO.

La sintaxis de la consulta es:

CREATE TABLE nombre_tabla (
columna_1 dato(tamaño),
columna_2 dato(tamaño),
columna_3 dato(tamaño),
… )

Donde:

  • nombre_tabla: indica el nombre que vamos a darle a la tabla
  • dato: indica el tipo de dato que tendrá la columna
  • tamaño: le dice a sql que tamaño tendrá el dato que se introduce en el campo

De este modo podemos ver como ejemplo la creación de una tabla llamada personas:

CREATE TABLE personas (
personaId int,
apellido varchar(255),
nombre varchar(255),
direccion varchar(255),
ciudad varchar(255)
)

Constraints

Con esto nos referimos a la utilización de reglas especificas para los datos de una tabla. De este modo si ocurre un error de compatibilidad entre el dato y el constraint, la acción se detiene debido al constraint.

Estas reglas se utilizan para controlar algunos de los datos que se utilizan en sql, y se introducen en la creación cuando creamos tablas de la siguiente forma:

CREATE TABLE nombre_tabla (
columna_1 dato(tamaño) constraint,
columna_2 dato(tamaño) constraint,
columna_3 dato(tamaño) constraint,
… )

Los tipos de constraints son:

  • NOT NULL: indica que la columna no puede tener el valor NULL
  • UNIQUE: confirma que cada fila de la columna debe de tener un valor único
  • PRIMARY KEY: es una combinación entre NOT NULL y UNIQUE, creando una identidad a cada fila para que sea muy fácil y rápido obtener el valor de solo esa fila por medio de su valor identificador.
  • FOREIGN KEY: Asegura que los datos de la tabla coincidan con los valores de referencia de otra
  • CHECK: Asegura que el valor de la columna cumple una condición especifica
  • DEFAULT: Determina un valor por defecto cuando no se especifica un valor para esta columna.

NOT NULL

Como ya hemos dicho NOT NULL se utiliza para indicar que el valor de un campo no acepte el valor NULL, es decir que no se le introduzcan valores al crear la tupla.

Siguiendo con nuestro ejemplo vamos a hacer que tanto la id como el apellido no puedan estar en blanco, por lo que haríamos los siguiente:

CREATE TABLE personas (
personaId int NOT NULL,
apellido varchar(255) NOT NULL,
nombre varchar(255),
direccion varchar(255),
ciudad varchar(255)
)

UNIQUE

Vamos a hacer que nuestra id sea única, aunque según nuestro sistema de BBDD será de forma diferente de este modo:

SQL Server / Oracle / MS Access:

CREATE TABLE personas (
personaId int NOT NULL UNIQUE,
apellido varchar(255) NOT NULL,
nombre varchar(255),
direccion varchar(255),
ciudad varchar(255)
)

Mysql

CREATE TABLE personas (
personaId int NOT NULL,
apellido varchar(255) NOT NULL,
nombre varchar(255),
direccion varchar(255),
ciudad varchar(255),
UNIQUE (personaId))

Si queremos crear el valor unico para diferentes tablas se hace igual en todas las BBDD de la siguiente forma:

CREATE TABLE personas (
personaId int NOT NULL,
apellido varchar(255) NOT NULL,
nombre varchar(255),
direccion varchar(255),
ciudad varchar(255),
CONSTRAINT uc_personaID UNIQUE (personaId, apellido))

Utilizando ALTER TABLE

Si ya tenemos la tabla creada y queremos hacer que uno de sus campos sea único, debemos de usar la siguiente consulta:

ALTER TABLE personas ADD UNIQUE (personaID)

Y si queremos que sean varios campos usamos:

ALTER TABLE personas ADD CONSTRAINT uc_personaID UNIQUE (personaID, apellido)

Utilizando DROP

Si queremos eliminar la condición de que un campo sea unico depende de nuestra base de datos, de modo que vemos dos versiones:

SQL Server / Oracle / MS Access

ALTER TABLE personas DROP CONSTRAINT uc_personaID

MySQL

ALTER TABLE personas DROP INDEX uc_personaID

PRIMARY KEY

Del mismo modo que con UNIQUE, la definición de este constraint depende del sistema de BBDD donde nos encontremos.

De hecho por defecto PRIMARY KEY contiene la restricción de UNIQUE y NOT NULL.

Una tabla solo puede tener como máximo una columna que hace de clave primaria, y aunque hay tablas donde pueden no ser necesarias, cuando diseño una BBDD me gusta que todas las tablas tengan un campo que sirve como primary key, aunque sea el campo id.

Al igual que sucede con UNIQUE, su definición depende de la BBDD que estemos utilizando, de ese modo debemos hacerlo según nuestro sistema.

SQL Server / Oracle / MS Access:

CREATE TABLE personas (
personaId int NOT NULL PRIMARY KEY,
apellido varchar(255) NOT NULL,
nombre varchar(255),
direccion varchar(255),
ciudad varchar(255)
)

Mysql

CREATE TABLE personas (
personaId int NOT NULL,
apellido varchar(255) NOT NULL,
nombre varchar(255),
direccion varchar(255),
ciudad varchar(255),
PRIMARY KEY (personaId))

Utilizando ALTER TABLE

Si ya tenemos la tabla creada y queremos hacer que uno de sus campos sea único, debemos de usar la siguiente consulta:

ALTER TABLE personas ADD PRYMARY (personaID)

Utilizando DROP

Si queremos eliminar la condición de que un campo sea primario depende de nuestra base de datos, de modo que vemos dos versiones:

SQL Server / Oracle / MS Access

ALTER TABLE personas DROP CONSTRAINT personaID

MySQL

ALTER TABLE personas DROP PRYMARY personaID

Foreign Key

Las claves foráneas (foreign key) se utilizan como puntos de unión entre tablas, ya que estos campos hacen referencia a la ID de otras tablas, pudiendo facilitar búsquedas,  y consultas.

Como hemos visto en los apartados anteriores es diferente segun la BBDD con la que estemos trabajando, de modo que:

SQL Server / Oracle / MS Access

CREATE TABLE Orders
(
O_Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
P_Id int FOREIGN KEY REFERENCES Persons(P_Id)
)

MySQL

CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
)

Si queremos utilizar mas de un campo foráneo utilizando constraint se hace de la siguiente forma:

CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
)

Utilizando ALTER TABLE

Si la tabla ya esta creada y queremos introducir una clave foránea lo hacemos de la siguiente manera:

ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

Y si son varias claves lo que queremos introducir:

ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

Utilizando DROP

Nuevamente depende de nuestra BBDD

SQL Server / Oracle / MS Access

ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders

MySQL

ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders

CHECK

La restricción CHECK se utiliza para limitar el rango de valores que se pueden colocar en una columnas.

Como en todas estas limitaciones, depende la BBDD que usemos el como se debe de escribir su sintaxis:

SQL Server / Oracle /MS Access

CREATE TABLE personas (
personaId int NOT NULL CHECK (personaId>0),
apellido varchar(255) NOT NULL,
nombre varchar(255),
direccion varchar(255),
ciudad varchar(255)
)

MySQL

CREATE TABLE personas (
personaId int NOT NULL,
apellido varchar(255) NOT NULL,
nombre varchar(255),
direccion varchar(255),
ciudad varchar(255),
CONSTRAINT chk_persona CHECK (personaId>0))

Si queremos permitir el nombramiento de diversas columnas se hace muy parecido a MySQL:

CREATE TABLE personas (
personaId int NOT NULL,
apellido varchar(255) NOT NULL,
nombre varchar(255),
direccion varchar(255),
ciudad varchar(255),
CONSTRAINT chk_persona CHECK (personaId>0 AND ciudad=’Sevilla’))

Utilizando ALTER TABLE

Para crear una restricción CHK en una columna cuando la tabla ya se ha creado, podemos hacerlo de la siguiente forma:

ALTER TABLE personas ADD CHECK (personaId>0)

Y si queremos añadir restricciones a varios campos:

ALTER TABLE personas ADD CONSTRAINT chk_persona CHECK (personaId>0 AND ciudad=’Sevilla’)

Utilizando DROP

Para eliminar una restricción CHECK depende de nuestra BBDD:

SQL Server / Oracel / MS Access

ALTER TABLE personas
DROP CONSTRAINT chk_persona

MySql

ALTER TABLE personas
DROP CHECK chk_persona

DEFAULT

DEFAULT se utiliza para insertar un valor predeterminado en una columna, de modo que este valor se añadira por defecto a la columna a menos que se utilice otro valor  al crear el registro.

Para crear una tabla con campos predefinidos lo hacemos como en el siguiente ejemplo:

CREATE TABLE personas (
personaId int NOT NULL,
apellido varchar(255) NOT NULL,
nombre varchar(255),
direccion varchar(255),
ciudad varchar(255) DEFAULT ‘Berlín’
)

Utilizando ALTER TABLE

Para introducir un valor por defecto una vez se ha creado la tabla depende de la BBDD que utilicemos:

SQL Server / MS Access

ALTER TABLE personas
ALTER COLUMN ciudad SET DEFAULT ‘Berlín’

Oracle

ALTER TABLE personas
MODIFY ciudad DEFAULT ‘Berlín’

MySQL

ALTER TABLE personas
ALTER ciudad SET DEFAULT ‘Berlín’

Utilizando DROP

Para eliminar una restricción DEFAULT debemos de utilizar la sintaxis que utilice nuestra BBDD

SQL Server / Oracle / MS Access

ALTER TABLE personas
ALTER COLUMN ciudad DROP DEFAULT

MySQL

ALTER TABLE personas
ALTER ciudad DROP DEFAULT