Manual Postgres
Manual Postgres
Instalacion
1
Listo, ya se ha instalado e iniciadio la Base de Datos. Existe un Pequeño problema que
realmente no es un problema, es una caracteristica de Seguridad del Paquete de
Instalacion de Ubuntu que no revela cual es la contraseña que se le asigno al usuario
'postgres', sin embargo, he creado la siguiente guia para ayudar a solventarlo:
Cambiano la contraseña
Probando la conexion
Para probar la conexion se puede utilizar la misma utilidad 'psql' de la siguiente forma:
psql -U postgres -W
2
Para PostgreSQL (7.2.1)
Verificar la instalación.
Para verificar que Postgres está corriendo:
nautilus:~# ps auxw | grep postgres
produce una salida similar a:
postgres 1263 0.0 0.7 8840 1852 pts/1 S 11:56 0:00
/usr/lib/postgresql/bin/postmaster
postgres 1265 0.0 0.7 9832 1828 pts/1 S 11:56 0:00 postgres: stats
buffer process
postgres 1267 0.0 0.7 8872 1864 pts/1 S 11:56 0:00 postgres: stats
collector process
Esto indica que el servidor está corriendo.
nautilus:~# su - postgres
asume identidad del usuario postgres desde root.
postgres@nautilus:~$ psql -l
List of databases
Name | Owner | Encoding
-----------+----------+----------
template0 | postgres | LATIN1
template1 | postgres | LATIN1
(2 rows)
muestra las bases de datos existentes.
3
quedando a la espera de comandos. Observar las opciones de ayuda, en
particular \q para salir de psql. Dice estar conectado a la base de
datos template1, lo cual queda consignado en el indicador de comando.
Los comandos inexistentes no dan salida alguna. La muestra de opciones
se pagina con los comandos de Unix more o less; en ambos casos se avanza
con la barra de espacio y se sale con 'q' (ver página man en Unix, man
less).
template1=> \q
sale de psql.
postgres@nautilus:~$ exit
logout
nautilus:~#
abandona la identidad del usuario postgres, vuelve a ser root.
Usuario de PostgreSQL.
Los usuarios de PostgreSQL deben ser "creados para PostgreSQL", es decir, creados en
los registros internos de PostgreSQL antes de poder operar con la base de datos. El
usuario de Unix debe ser declarado usuario de PostgreSQL. Esta operación debe
hacerse operando como el usuario postgres, accediendo a este usuario desde root
como se mostró antes.
Es sumamente importante crear un usuario con privilegios de administrador para la
base de datos, para evitar tener que operar como root y luego impersonar postgres.
Este usuario es plenipotenciario para Postgres.
Como root, asumiento la identidad del usuario postgres, el comando Unix createuser
crea un nuevo usuario de PostgreSQL, con el siguiente diálogo:
nautilus:~# su - postgres
postgres@nautilus:~$ createuser
Enter name of user to add: victor
Shall the new user be allowed to create databases? (y/n) y
Shall the new user be allowed to create more new users? (y/n) y
CREATE USER
postgres@nautilus:~$
crea el usuario victor con privilegios de crear bases de datos y nuevos usuarios. Los
usuarios de Postgres son diferentes a los de Unix; en principio conviene mantener una
correspondencia, es decir, crear en PostgreSQL un usuario existente en Unix como se
hizo aquí. Usuarios propios de PostgreSQL pueden crearse con comandos SQL; deberá
no sólo crearse el usuario sino adjudicársele permisos sobre las bases de datos que
corresponda (ver en Manual del Administrador el tema Usuarios y Permisos).
nautilus:/root$ exit
exit
nautilus:~#
sale de usuario postgres, queda en root.
4
Crear una base de datos de prueba.
Operando en la cuenta del usuario habilitado en PostgreSQL, en el shell de Unix,
victor@nautilus:~$ createdb prueba
CREATE DATABASE
repite el comando SQL y crea la base de datos "prueba", sin tablas ni ningún otro
elemento; estos podrán crearse usando PgAccess o usando el propio lenguaje psql. Los
comandos en psql terminan con ";". Si se olvida, no se muestra ningún mensaje ni se
ejecuta el comando.
prueba=# \l
List of databases
Name | Owner | Encoding
-----------+----------+----------
prueba | victor | LATIN1
template0 | postgres | LATIN1
template1 | postgres | LATIN1
(3 rows)
Lista las bases de datos existentes.
Puede crearse una base de datos con comandos SQL, sin usar el script del shell:
victor@nautilus:~$ psql template1
ingresa en psql.
template1=# CREATE DATABASE prueba2;
CREATE DATABASE
crea la nueva base de datos.
template1=# \l
lista bases de datos existentes, mostrando la recientemente creada.
template1=# DROP DATABASE victor;
DROP DATABASE
destruye la base de datos indicada.
template1=# \l
lista bases de datos existentes, verificando la desaparición de la eliminada.
5
Destruir una base de datos.
Operando como usuario administrador, ingresar en psql.
template1=> DROP DATABASE prueba;
DESTROYDB
template1=>
destruye la base de datos "prueba". Recordar terminar los comandos con ";". Si se
olvida, no se muestra ningún mensaje ni se ejecuta el comando.
2.2 Conceptos
PostgreSQL es un sistema de gestión de base de datos relacional (RDBMS). Esto
significa que es un sistema de gestión de los datos almacenados en las relaciones.
Relación es esencialmente un término matemático para el cuadro. El concepto de
almacenamiento de datos en las tablas es tan común hoy que en sí puede parecer
obvio, pero hay una serie de otras formas de organización de bases de datos. Archivos
y directorios en Unix como sistema operativo de un ejemplo de una base de datos
jerárquica. Un desarrollo más moderno es la base de datos orientada a objetos.
Cada tabla es el nombre de una colección de filas. Cada fila de una tabla dada tiene
el mismo nombre de las columnas, y cada columna es de un determinado tipo de
datos. Considerando que las columnas tienen un orden fijo en cada fila, es importante
recordar que SQL no garantiza el orden de las filas dentro de la tabla de ninguna
manera (aunque pueden ser ordenados expresamente para la pantalla).
Cuadros se agrupan en bases de datos, y una colección de bases de datos gestionadas
por un único servidor PostgreSQL ejemplo, constituye una base de datos de clúster.
Usted puede entrar en este psql con los saltos de línea. Psql reconocerá que el
comando no está terminado hasta el punto y coma.
Espacio en blanco (es decir, espacios, tabulaciones y saltos de línea) pueden ser
utilizadas libremente en comandos SQL. Eso significa que usted puede escribir el
comando alineados diferente a la de arriba, o incluso la totalidad en una sola línea.
Dos guiones ( "-") introducir comentarios. Sea cual sea sigue es ignorado hasta el
final de la línea. SQL no tiene en cuenta mayúsculas sobre las palabras claves y los
identificadores, excepto cuando son identificadores entre comillas dobles para
preservar el caso (no se hizo anteriormente).
6
varchar (80) se especifica un tipo de datos que puede almacenar cadenas de
caracteres arbitrarios de hasta 80 caracteres de longitud. int es el tipo entero normal.
verdadero es un tipo único de precisión para el almacenamiento de números de punto
flotante. fecha debería ser auto-explicativo. (Sí, la columna de tipo fecha se llama
también la fecha. Esto puede ser conveniente o confusa - que usted elija.)
PostgreSQL soporta el estándar SQL tipos int, smallint, real, doble precisión,
char (N), varchar (N), fecha, hora, fecha y hora, y el intervalo, así como
otros tipos de utilidad general y un rico conjunto de tipos geométricos. PostgreSQL
puede ser personalizado con un número arbitrario definido por el usuario de los tipos
de datos. En consecuencia, los nombres no son de tipo sintáctico palabras clave,
excepto cuando sea necesario para apoyar a los casos especiales en el estándar SQL.
El segundo ejemplo almacenará las ciudades y sus asociados la ubicación geográfica:
CREATE TABLE ciudades (
nombre varchar (80),
ubicación point
);
Tenga en cuenta que todos los tipos de datos de uso bastante obvio formatos de
entrada. Constantes que no son simples valores numéricos por lo general debe ser
rodeado por comillas simples ( '), como en el ejemplo. El tipo de fecha es bastante
flexible en lo que se acepta, pero para este tutorial vamos a atenernos a la inequívoca
formato se muestra aquí.
El punto que requiere una coordinación de tipo par como entrada, como se muestra
aquí:
INSERT INTO ciudad VALUES ( 'San Francisco', '(-194,0, 53,0)');
La sintaxis utilizada hasta la fecha requiere que recordar el orden de las columnas.
Una sintaxis alternativa le permite enumerar las columnas explícitamente:
INSERT INTO tiempo (ciudad, temp_lo, temp_hi, prcp, fecha)
VALUES ( 'San Francisco', 43, 57, 0,0,'1994-11-29 ');
Puede listar las columnas en un orden diferente si lo desea, o incluso omitir algunas
7
columnas, por ejemplo, si la precipitación es desconocido:
INSERT INTO tiempo (fecha, ciudad, temp_hi, temp_lo)
VALUES ('1994-11-29 ',' Hayward ', 54, 37);
donde el nombre de archivo para el archivo de código fuente debe estar disponible
para el servidor de backend máquina, no el cliente, desde el backend del servidor lee
el archivo directamente. Puede obtener más información sobre el comando COPY en
COPIA.
El * es un comodin para "todas las columnas". [1] Por lo tanto, el mismo resultado se
tuvo con:
SELECT ciudad, temp_lo, temp_hi, prcp, fecha FROM tiempo;
8
Ciudad | temp_avg | fecha
---------------+----------+------------
San Francisco | 48 | 1994-11-27
San Francisco | 50 | 1994-11-29
Hayward | 45 | 1994-11-29
(3 rows)
Resultado:
Usted puede solicitar que los resultados de una consulta se devolverá ordenados en
orden:
SELECT * FROM clima
ORDER BY ciudad;
Usted puede solicitar que se eliminan las filas duplicadas de los resultados de una
consulta:
SELECT DISTINCT ciudad
FROM tiempo;
Ciudad
---------------
Hayward
9
San Francisco
(2 rows)
Una vez más, el resultado puede variar de pedidos fila. Puede garantizar la
coherencia de los resultados mediante el uso de distintos y ORDER BY juntos: [2]
SELECT DISTINCT ciudad
FROM tiempo
ORDER BY ciudad;
Notes Notas
10
porque las listas de las columnas de la weather y la cities de mesa se
concatenan. En la práctica, esto no es deseable, aunque, por lo que
probablemente desea incluir explícitamente la salida de las columnas en lugar
de utilizar *:
SELECT ciudad, temp_lo, temp_hi, prcp, fecha, lugar
FROM tiempo, ciudades
WHERE ciudad = nombre;
En general, se considera buen estilo para calificar todos los nombres de columna en
una unión de consulta, de modo que la consulta no dejará un duplicado si la columna
es el nombre más tarde añadió a uno de los cuadros.
Únete a las preguntas del tipo visto hasta ahora también se puede escribir en esta
forma alternativa:
SELECT *
FROM tiempo INNER JOIN ciudades ON (tiempo.cudad = ciudades.nombre);
Esta sintaxis no es tan usado como la anterior, pero se muestra aquí para ayudarle a
comprender los siguientes temas.
Ahora vamos a ver cómo podemos obtener el registro Hayward atrás pulg ¿Qué
queremos que la consulta que hacer es escanear el tiempo y el cuadro de cada fila
para encontrar la concordancia ciudades fila (s). Si no se pongan en venta se
encuentra la fila que queremos algunos "valores vacíos" para ser sustituido por la
cities las columnas de las tablas. Este tipo de consulta que se llama un OUTER JOIN.
(La suma que hemos visto hasta ahora se une interior). El comando es así:
SELECT *
FROM tiempo LEFT OUTER JOIN ciudades ON (tiempo.ciudad = ciudades.nombre);
11
con algunos de la fila mesa de la izquierda. Cuando la salida de una fila de la tabla a
la izquierda-para el que no existe el derecho de mesa partido, vacío (nulo) los valores
son sustituidos por el derecho-las columnas de la tabla.
Ejercicio: Hay también derecho externas y la plena externas. Trate de averiguar lo
que las hacen.
También podemos participar en una mesa frente a sí mismo. Esto se llama una libre
adhesión. Como ejemplo, supongamos que queremos encontrar todos los registros
meteorológicos que se encuentran en el rango de temperatura de otros registros
meteorológicos. Así que tenemos que comparar el temp_lo y columnas de cada
temp_hi tiempo a la fila temp_lo y temp_hi todas las demás columnas de tiempo filas.
Podemos hacer esto con la siguiente consulta:
Aquí tenemos tabla clima W1 y W2 como para poder distinguir la izquierda y derecha de
la adhesión. También puede utilizar este tipo de alias en otras consultas para ahorrar
escribir, por ejemplo:
SELECT *
FROM clima w, ciudades c
WHERE w.city = c.name;
max
-----
46
12
(1 row)
pero esto no funcionará ya que el total max no puede utilizarse en la cláusula WHERE.
(Esta restricción existe porque la cláusula WHERE determina qué registros se incluirán
en el cálculo global, por lo tanto es obvio que tiene que ser evaluado antes de agregar
funciones se computan.) Sin embargo, como suele ser el caso, la consulta puede ser
vuelto a lograr el resultado deseado , aquí con una subconsulta:
SELECT ciudad FROM clima
WHERE temp_lo = (SELECT max(temp_lo) FROM clima);
Ciudad
---------------
San Francisco
(1 row)
Ciudad | máx
---------------+-----
Hayward | 37
San Francisco | 46
(2 rows)
que nos da una salida de línea para cada ciudad. Cada resultado global se calcula
sobre la mesa las filas que coinciden con la ciudad. Podemos filtrar estas filas
agrupadas usando HAVING:
SELECT ciudad, max (temp_lo)
FROM clima
GROUP BY ciudad
HAVING max(temp_lo) < 40;
Ciudad | máx
---------+-----
Hayward | 37
(1 row)
que nos da los mismos resultados sólo para las ciudades que han temp_lo todos los
valores por debajo de 40. Por último, si sólo se preocupan por las ciudades cuyos
nombres comienzan con "S" que podríamos hacer:
13
SELECT ciudad, max (temp_lo)
FROM clima
WHERE ciudad LIKE 'S%' (1)
GROUP BY ciudad
HAVING max(temp_lo) < 40;
(1)
El operador LIKE no coincidencia de patrones y se explica en Sección 9.7.
14
Constraints Limitaciones
Data types are a way to limit the kind of data that can be stored in a table. Tipos de
datos son una manera de limitar el tipo de datos que pueden almacenarse en una
tabla. For many applications, however, the constraint they provide is too coarse. Para
muchas aplicaciones, sin embargo, la limitación que ofrecen es demasiado gruesa. For
example, a column containing a product price should probably only accept positive
values. Por ejemplo, una columna que contiene un producto de precio probablemente
sólo aceptar los valores positivos. But there is no standard data type that accepts only
positive numbers. Pero no hay ningún tipo de datos estándar que sólo acepta números
positivos. Another issue is that you might want to constrain column data with respect
to other columns or rows. Otra cuestión es que usted puede ser que desee para limitar
los datos de la columna con respecto a otras columnas o filas. For example, in a table
containing product information, there should be only one row for each product number.
Por ejemplo, en un cuadro que contiene información sobre el producto, sólo puede
haber una fila para cada número de producto.
To that end, SQL allows you to define constraints on columns and tables. A tal fin, SQL
le permite definir las limitaciones en las columnas y tablas. Constraints give you as
much control over the data in your tables as you wish. Las limitaciones de darte el
máximo control sobre los datos en las tablas que desee. If a user attempts to store
data in a column that would violate a constraint, an error is raised. Si un usuario
intenta guardar datos en una columna que viole una limitación, un error. This applies
even if the value came from the default value definition. Esto se aplica incluso si el
valor ha venido de la definición de valor por defecto.
15
precios de los productos positivo, se puede usar:
CREATE TABLE products ( CREATE TABLE productos (
product_no integer, product_no entero,
name text, Nombre del texto,
price numeric CHECK (price > 0) precio numérico CHECK (precio> 0)
); );
As you see, the constraint definition comes after the data type, just like default value
definitions. Como puede ver, la dificultad viene después de la definición de tipo de
datos, como valor por defecto definiciones. Default values and constraints can be
listed in any order. Valores por defecto y las limitaciones se pueden enumerar en
cualquier orden. A check constraint consists of the key word CHECK followed by an
expression in parentheses. Un cheque limitación consiste en la palabra clave VERIFICA
seguido por una expresión en paréntesis. The check constraint expression should
involve the column thus constrained, otherwise the constraint would not make too
much sense. El cheque debe implicar limitación expresión de la columna por lo tanto,
limitado, de lo contrario la limitación no tendría demasiado sentido.
You can also give the constraint a separate name. También puede dar el nombre de
una limitación. This clarifies error messages and allows you to refer to the constraint
when you need to change it. Esto clarifica los mensajes de error y le permite hacer
referencia a la limitación cuando es necesario cambiarlo. The syntax is: La sintaxis es:
CREATE TABLE products ( CREATE TABLE productos (
product_no integer, product_no entero,
name text, Nombre del texto,
price numeric CONSTRAINT positive_price CHECK (price > 0) precio numérico
positive_price CONSTRAINT CHECK (precio> 0)
); );
So, to specify a named constraint, use the key word CONSTRAINT followed by an
identifier followed by the constraint definition. Así, para especificar el nombre de una
limitación, el uso de la palabra clave CONSTRAINT seguido de un identificador seguido
por la limitación definición. (If you don't specify a constraint name in this way, the
system chooses a name for you.) (Si no especifica una limitación en nombre de esta
manera, el sistema elige un nombre para usted.)
A check constraint can also refer to several columns. Una limitación de verificación
también puede referirse a varias columnas. Say you store a regular price and a
discounted price, and you want to ensure that the discounted price is lower than the
regular price: Supongamos que una tienda de precios y un descuento en el precio, y
quiere asegurarse de que el precio es inferior al precio regular:
CREATE TABLE products ( CREATE TABLE productos (
product_no integer, product_no entero,
name text, Nombre del texto,
price numeric CHECK (price > 0), precio numérico CHECK (precio> 0),
discounted_price numeric CHECK (discounted_price > 0), discounted_price numérico
CHECK (discounted_price> 0),
CHECK (price > discounted_price) CHECK (precio> discounted_price)
); );
The first two constraints should look familiar. Las dos primeras limitaciones que parece
16
familiar. The third one uses a new syntax. El tercero utiliza una nueva sintaxis. It is not
attached to a particular column, instead it appears as a separate item in the comma-
separated column list. No se adjunta a una columna, sino que aparece como un tema
separado en la columna separados por comas lista. Column definitions and these
constraint definitions can be listed in mixed order. Columna de definiciones y
definiciones de estas limitaciones pueden ser listados en orden mixto.
We say that the first two constraints are column constraints, whereas the third one is a
table constraint because it is written separately from any one column definition.
Nosotros decimos que las dos primeras restricciones son las limitaciones de la
columna, mientras que la tercera es una tabla limitación porque se escribe separado
de cualquier columna de una definición. Column constraints can also be written as
table constraints, while the reverse is not necessarily possible, since a column
constraint is supposed to refer to only the column it is attached to. Las limitaciones de
la columna también puede ser escrito como las limitaciones de la tabla, mientras que
a la inversa no es necesariamente posible, desde una columna de limitación se supone
que sólo se refieren a la columna que va adherida. ( PostgreSQL doesn't enforce that
rule, but you should follow it if you want your table definitions to work with other
database systems.) The above example could also be written as: (PostgreSQL no hace
cumplir esta norma, pero usted debe seguir si desea que su tabla de definiciones para
trabajar con otros sistemas de bases de datos). El ejemplo anterior también puede ser
escrito como:
CREATE TABLE products ( CREATE TABLE productos (
product_no integer, product_no entero,
name text, Nombre del texto,
price numeric, precio numérico,
CHECK (price > 0), CHECK (precio> 0),
discounted_price numeric, discounted_price numérico,
CHECK (discounted_price > 0), CHECK (discounted_price> 0),
CHECK (price > discounted_price) CHECK (precio> discounted_price)
); );
or even: o incluso:
CREATE TABLE products ( CREATE TABLE productos (
product_no integer, product_no entero,
name text, Nombre del texto,
price numeric CHECK (price > 0), precio numérico CHECK (precio> 0),
discounted_price numeric, discounted_price numérico,
CHECK (discounted_price > 0 AND price > discounted_price) CHECK (discounted_price>
0 AND precio> discounted_price)
); );
17
discounted_price numeric, discounted_price numérico,
CHECK (discounted_price > 0), CHECK (discounted_price> 0),
CONSTRAINT valid_discount CHECK (price > discounted_price) Valid_discount
CONSTRAINT CHECK (precio> discounted_price)
); );
It should be noted that a check constraint is satisfied if the check expression evaluates
to true or the null value. Cabe señalar que una restricción de verificación se cumple si
la expresión se evalúa para comprobar la verdad o el valor nulo. Since most
expressions will evaluate to the null value if any operand is null, they will not prevent
null values in the constrained columns. Dado que la mayoría de expresiones evaluará
al valor nulo si algún operando es nulo, que no impedirá valores nulos en las columnas
limitada. To ensure that a column does not contain null values, the not-null constraint
described in the next section can be used. Para asegurarse de que una columna no
contiene valores nulos, el no-nula limitación descrita en la siguiente sección se puede
utilizar.
The order doesn't matter. El orden no importa. It does not necessarily determine in
18
which order the constraints are checked. No determina necesariamente el orden en
que las limitaciones están marcadas.
The NOT NULL constraint has an inverse: the NULL constraint. La restricción NOT NULL
tiene una inversa: la limitación NULL. This does not mean that the column must be
null, which would surely be useless. Esto no significa que la columna debe ser nulo, lo
que sin duda ser inútil. Instead, this simply selects the default behavior that the
column might be null. En lugar de ello, simplemente selecciona el comportamiento por
defecto de la columna que puede ser nula. The NULL constraint is not present in the
SQL standard and should not be used in portable applications. NULL limitación no está
presente en el estándar SQL y no debe utilizarse en aplicaciones portátiles. (It was
only added to PostgreSQL to be compatible with some other database systems.) Some
users, however, like it because it makes it easy to toggle the constraint in a script file.
(Se añade a PostgreSQL sólo para ser compatible con otros sistemas de bases de
datos.) Algunos usuarios, sin embargo, porque lo hace fácil para cambiar la restricción
en un archivo de comandos. For example, you could start with: Por ejemplo, usted
podría empezar con:
CREATE TABLE products ( CREATE TABLE productos (
product_no integer NULL, product_no entero NULL,
name text NULL, de texto Nombre de NULL,
price numeric NULL precio numérico NULL
); );
and then insert the NOT key word where desired. y, a continuación, insertar la palabra
clave que no desea.
Tip: In most database designs the majority of columns should be marked not
null. Sugerencia: En la mayoría de los diseños de base de datos la mayoría
de las columnas no deben estar marcados nula.
19
Si una única restricción se refiere a un grupo de columnas, las columnas se enumeran
separados por comas:
CREATE TABLE example
a integer,
b integer,
c integer,
UNIQUE (a, c)
);
Esto especifica que la combinación de los valores indicados en las columnas es única
en toda la tabla, aunque cualquiera de las columnas no tienen por qué ser (y
normalmente no es) única.
Puede asignar su propio nombre para una única limitación, en la forma habitual:
CREATE TABLE productos (
product_no integer CONSTRAINT must_be_different UNIQUE,
Nombre del text,
precio numeric
);
En general, una única limitación es violada cuando hay dos o más filas en la mesa
donde los valores de todas las columnas incluidas en la restricción son iguales. Sin
embargo, dos valores nulos no se consideran iguales en esta comparación. Esto
significa que, incluso en presencia de una única limitación es posible almacenar por
duplicado filas que contengan un valor nulo en al menos una de las columnas limitada.
Este comportamiento se ajusta al estándar SQL, pero hemos escuchado que otras
bases de datos SQL puede no seguir esta regla. Así que tenga cuidado al desarrollo de
aplicaciones que están destinados a ser portátil.
Primary keys (Claves primarias) también pueden limitar más de una columna, la
sintaxis es similar a la única limitaciones:
CREATE TABLE ejemplo (
a integer,
b integer,
20
c integer,
PRIMARY KEY (a, c)
);
Una clave principal se indica que una columna o grupo de columnas puede ser
utilizado como un identificador único para las filas en la tabla. (Esta es una
consecuencia directa de la definición de una clave principal. Tenga en cuenta que una
limitación no, por sí sola, proporcionar un identificador único, ya que no excluye
valores nulos.) Esto es útil tanto para propósitos de documentación y de las
aplicaciones cliente. Por ejemplo, una aplicación GUI que permite modificar los valores
fila probablemente necesita saber la clave principal de una tabla para poder identificar
las filas única.
Una tabla puede tener como máximo una clave principal. (No puede ser cualquier
número de único y no nulo limitaciones, que son funcionalmente lo mismo, pero sólo
uno puede ser identificado como la clave principal.) Base de datos relacional de la
teoría dicta que cada mesa debe tener una clave principal. Esta regla no es aplicada
por PostgreSQL, pero es mejor seguirla.
Vamos a suponer también que haya una mesa de almacenar los pedidos de estos
productos. Queremos asegurarnos de que las órdenes cuadro sólo contiene las
órdenes de los productos a los que realmente existen. Por lo tanto, definir una clave
foránea en la tabla de pedidos que las referencias de los productos de mesa:
CREATE TABLE pedidos (
order_id integer PRIMARY KEY,
product_no integer REFERENCES products (product_no) ,
cantidad integer
);
21
CREATE TABLE pedidos (
order_id integer PRIMARY KEY,
product_no integer REFERENCES products ,
cantidad integer
);
Observe que la clave principal se superpone con las claves foráneas en la última
mesa.
Sabemos que las claves foráneas rechazar la creación de los pedidos que no se
22
refieren a los productos. Pero lo que si un producto es removido después de un fin se
ha creado lo que las referencias? SQL le permite manejar eso. Intuitivamente,
tenemos algunas opciones:
• Inhabilitar eliminar un producto de referencia
• Eliminar las órdenes y
• Otra cosa?
Para ilustrar esto, vamos a aplicar la siguiente política sobre los muchos-a-muchos
relación ejemplo anterior: cuando alguien quiere eliminar un producto que sigue
siendo de referencia por una orden (a través de order_items), que rechace la misma.
Si alguien quita una orden, el orden se eliminan los artículos así como:
CREATE TABLE productos (
product_no integer PRIMARY KEY,
nombre text,
precio numeric
);
Restricting and cascading deletes are the two most common options. RESTRICT
prevents deletion of a referenced row. NO ACTION means that if any referencing rows
still exist when the constraint is checked, an error is raised; this is the default behavior
if you do not specify anything. Restringir y elimina en cascada son las dos opciones
más comunes. RESTRINGIR impide la supresión de una referencia a la fila. ACCIÓN NO
significa que si cualquier referencia filas siguen existiendo cuando la limitación está
marcada, se planteó un error, que es el comportamiento por defecto si no especifica
cualquier cosa. (The essential difference between these two choices is that NO ACTION
allows the check to be deferred until later in the transaction, whereas RESTRICT does
not.) CASCADE specifies that when a referenced row is deleted, row(s) referencing it
should be automatically deleted as well. (La diferencia esencial entre estas dos
opciones es que no permite que el cheque que se aplace hasta después de la
transacción, mientras que no restringir.) CASCADE se especifica que cuando uno se
hace referencia, se suprime la fila, fila (s) de referencia debería ser eliminado
automáticamente también. There are two other options: SET NULL and SET DEFAULT .
Hay otras dos opciones: SET NULL y SET DEFAULT. These cause the referencing
columns to be set to nulls or default values, respectively, when the referenced row is
deleted. Estas referencias a la causa columnas a ser fijados a los valores por defecto o
23
nulos, respectivamente, cuando la fila se hace referencia, se suprime. Note that these
do not excuse you from observing any constraints. Tenga en cuenta que estos no le
exime de la observación de las limitaciones. For example, if an action specifies SET
DEFAULT but the default value would not satisfy the foreign key, the operation will fail.
Por ejemplo, si una acción SET DEFAULT especifica el valor por defecto pero no se
ajustaría a la clave foránea, la operación fracasará.
Analogous to ON DELETE there is also ON UPDATE which is invoked when a referenced
column is changed (updated). Análoga a ON DELETE es también ON UPDATE que se
invoca cuando una columna se hace referencia se cambia (actualizado). The possible
actions are the same. Las acciones posibles son las mismas.
More information about updating and deleting data is in Chapter 6 . Más información
acerca de la actualización y supresión de datos en el capítulo 6.
Finally, we should mention that a foreign key must reference columns that either are a
primary key or form a unique constraint. Por último, debemos mencionar que una
clave foránea debe hacer referencia a las columnas que, o bien son una clave principal
o una forma única limitación. If the foreign key references a unique constraint, there
are some additional possibilities regarding how null values are matched. Si la clave
foránea hace referencia a un único obstáculo, hay algunas otras posibilidades con
respecto a cómo se comparan valores nulos. These are explained in the reference
documentation for CREATE TABLE . Estos se explican en la documentación de
referencia para CREATE TABLE.
24