Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Curso de PostgreSQL

Curso de PostgreSQL

Oswaldo Rodríguez González

Oswaldo Rodríguez González

Inserción y consulta de datos

16/32
Recursos

Aportes 66

Preguntas 11

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Hay una situación importante sobre las claves foráneas (FK) que se explica en esta clase y me gustaría resaltarla un poco mas:
Primeramente recordar del curso de Fundamentos de BD que a las tablas se les llama “independientes” cuando no tienen FK’s. Del mismo modo una tabla es “dependiente” cuando tiene al menos una FK, es decir, son tablas que dependen de tablas independientes.
Es importante** al momento de crear tablas e insertar datos en ellas**, empezar siempre por las tablas independientes y una vez terminadas seguir con las dependientes

Hay que tener mucho cuidado con las llaves foraneas cuando se deja la opcion de CASCADA cuando se borra o se actualiza. Ayuda a ahorrar tiempo, perr esto puede afectar la transacionalidad en bases grandes.

Postgresql, es una excelente opción para tener una BD relacional.

--/////////////////
--16.Inserción y consulta de datos
--////////////////



SELECT * FROM public.estacion;--si data
SELECT * FROM public.pasajero;--reto
SELECT * FROM public.trayecto;--si data
SELECT * FROM public.tren;--si data
SELECT * FROM public.viaje;--reto




--insert "estacion"
INSERT INTO public.estacion (nombre,direccion)
VALUES 
    ('Estación Centro','St 1# 12'),
    ('Estación Norte','St 100# 112')
;

--insert "tren"
INSERT INTO public.tren (capacidad,modelo)
VALUES 
    (100,'Modelo 1'),
    (100,'Modelo 2')
;

--insert "trayecto"
INSERT INTO public.trayecto (tren,estacion,nombre)
VALUES
    (1,1,'Ruta 1');
    (2,2,'Ruta 2');
;

-- RETO
INSERT INTO public.pasajero (nombre,fecha_nacimiento,direccion_residencia)
VALUES
    ('José Ordoñez','1987-1-3','St 100# 12'),
    ('Ángel Quintero','1987-1-12','St 101# 12'),
    ('Rafel Castillo','1977-1-12','St 102# 12'),
;
INSERT INTO public.viaje (id_pasajero,id_trayecto,inicio,fin)
 VALUES
    (1,1,'2019-01-02','2019-01-02'),
    (2,1,'2019-01-03','2019-01-03'),
    (2,2,'2019-01-04','2019-01-04'),
    (3,2,'2019-01-04','2019-01-04')

;
-- Delete sin limit
DELETE FROM public.estacion WHERE estacion.id  =4;
--delete limit
DELETE FROM public.estacion WHERE estacion.id IN
     (
		SELECT id FROM public.estacion 
	  		WHERE estacion.id IN(3,4)
			ORDER BY  estacion.id  
		 	LIMIT 2
	 )
;

-- update sin limit
UPDATE public.estacion
SET id=4, nombre='Estación SUR-OESTE', direccion='St 4# 1'
WHERE estacion.id = 4;

-- update utilizando limit
UPDATE public.estacion
	SET 
		id=4, 
		nombre='Estación SUR-OESTE', 
		direccion='St 4# 1'
	WHERE id IN (
		SELECT estacion.id FROM public.estacion
			WHERE estacion.id in(4)
			ORDER BY estacion.id
			LIMIT 1
	)
;

Añadir algo el delete con limit es algo que vi en el curso de mysql sql y es buena práctica limitar la operación por si algo sale mal, pero en el caso de postgres me parece que es algo contra producente ya que para hacerlo con limit hay que hacerlo a través de una subquery

Tanto poder en algo tan sencillo 👨‍💻

Este pgAdmin es enserio muy sencillo-

Es muy, pero muy importante cuando se usan las sentencias DELETE y UPDATE, nunca pero nunca pero nunca jamas olvidar o quitar el WHERE.

Y para que nunca se nos olvide esta canción:

https://www.youtube.com/watch?v=i_cVJgIz_Cs

¿Cómo modificar el tipo de de una columna?


Si el tipo al que quieres cambiar es compatible como por ejemplo de integer => numeric puedes poner:

ALTER TABLE public.<table_name> 
ALTER COLUMN <column_name>
TYPE <new_type>;


Pero si quieres cambiar al un tipo que es incompatible como por ejemplo text => integer y te sale un error como este:

ERROR:  column "model" cannot be cast automatically to type integer
SUGERENCIA:  You might need to specify "USING model::integer".


Entonces pones lo sgte para forzar el cambio de tipo:

ALTER TABLE public.<table_name>
ALTER COLUMN <column_name>
TYPE <new_type>
USING <column_name>::<new_type>;

La verdad que PostgreSQL si facilita mucho la vida, es una muy buena opción muy intuitiva.

Holaa! Les dejo un dato SUPER importante, a la hora de escribir, tengan mucho cuidado… si usan mayusculas a la hora de insertar un valor, deben escribirlo asi:
“ID_trayecto” o sin mayusculas id_trayecto.
Lo acalro porque postgre les hara la vida imposible si no ponen comillas en las mayusculas, ya que piensa que es un dato de aplicacion, como un INSERT y no como un dato propio. Les dira por ejemplo que esa columna no existe.

Acá les dejo una herramienta online para generar datos de forma masiva y poder hacer pruebas

https://www.onlinedatagenerator.com/

Me parece que con pg admin no se aprende real mente lo que hace postgres es mejor seguir el curso con la consola

-- Agregando datos a la tabla estacion
INSERT INTO public.estacion (nombre, direccion)
VALUES ('Estacion Centro', 'St 1#12');

-- comprobamos los datos de la tabla estacion
SELECT * FROM public.estacion;

-- Agregando datos a la tabla tren
INSERT INTO public.tren (capacidad, modelo)
VALUES (100, 'Modelo 1');

-- comprobamos los datos de la tabla tren
SELECT * FROM public.tren;

-- Para eliminar y despues agregar la columna de nombre a la tabla trayecto
ALTER TABLE public.trayecto DROP COLUMN nombre;
ALTER TABLE public.trayecto ADD nombre character varying(100);

-- Agregando datos a la tabla trayecto
INSERT INTO public.trayecto (id_estacion, id_tren, nombre)
VALUES (1, 1, 'Ruta 1');

-- Comprobamos los datos de la tabla trayecto
SELECT * FROM public.trayecto;

-- Eliminar una tubla de la tabla tren con el id = 1, como esta en cascada se elimino la tuplas que tenian ese id_tren
DELETE FROM public.tren WHERE id = 1;

-- Cambiar la tupla que tenda el id = de la tabla tren
UPDATE public.tren SET id = 1 WHERE id = 2;

Excelente curso!!

#✅ Buena e Importante Práctica 💡
.
➡️ Hay que ser muy específicos al utilizar UPDATE y DELETE por lo que una buena práctica es utilizar el ID de lo que se quiere borrar.
.
➡️ Siempre que se utilicen uno de estos comandos es importante poner un LIMIT de acuerdo al número de datos a modificar.

Me siento totalmente perdido en este curso.

No se si el la tabla trayecto tiene mucho sentido si es que no dice a donde va sino de donde sale. Una vez creada la tabla ‘Estaciones’ (si, en plural) se deberia anadir a la dependiente ‘Trayectos’ la columna id_destino (foreign key de id_estaciones).
Es una buena practica?

Se tiene dos tabla a y b. y tienen los atributos a.id y b.id y b.id_a que referencia al id de la tabla a. Debemos tomar en cuenta que no se pueden insertar id en el registros en la tabla b.id_a que no existan el tabla a.

Configurar una tabla con foreign key en cascada permite que al borrar o actualizar datos en la tabla de origen tambien se borre o actualice los datos en la tabla con el foreign key

Yo trabajo con Ubuntu 18.04 directamente en terminal. He creado un user (transport_manager) con los privileges de ‘update’,‘insert’ y
’select’ pero aún así no podía hacer insert ya que tengo los campos de primary key de una tabla con ‘SERIAL’. Hay que añadir también los privileges ‘update’ y ‘select’ de la table ‘sequence’ asociada, de cada tabla que lo tenga, a este user (transport_manager) para poder hacer insert.

Si la tabla es ‘train’ y quiero dar privileges a la tabla sequence de train para el user transport_manager (las tablas sequence no permiten añadir privileges de insert):
trasnport=# set role postgres;
transpot=# grant update, select on train_id_sequence_id to transport_manager;

Fijar el valor de una tabla sequence (la de mi tabla ‘train’ es ‘train_id_sequence_id’) para que empiece por 0:
alter sequence train_id_sequence_id restart with 0;

Si tras hacer un insert en la tabla train ya existe un elemento con el id que le asigna la tabla sequence de forma automática, el insert no se producirá.

Puedo importar tablas de excel a PostgreSQL?

Se debe tener en cuenta los delete que se haga en una de las tablas, ya que si borro alguno de los datos, se verá afectada la forma en que venia trabajando.
Debido a la configuración de cascada, se actualizan los datos de las tablas que se encuentren con llaves foráneas, si genero cambios en una de las tablas asociada a estás.

Excelente clase.

Excelente la recomendación de realizar eliminaciones lógicas, pero…
¿Está bien no borrar ningún dato de la base de datos?

Se puede responder esta pregunta con una necesidad de todo sistema (pues los recursos ilimitados no existen, dado que siempre está asociado a un costo): La gestión del uso de disco.

La gestión de uso disco requerirá que el sistema tenga algún mecanismo de limpieza, eliminando la data antigua y dejando espacio para la nueva (esto requerirá un mantenimiento a la BD, como la desfragmentación y actualización de estadísticas, recomiendo el curso de Optimización de BD). Solo de esta manera aseguramos que el recurso de uso de disco no se agote.

¿Y qué pasaría si la información histórica es indispensable?
Por ejemplo, en bancos se requieren datos de al menos 5 años atrás para verificar o validar la trazabilidad de las transacciones financieras.
Normalmente se usan otros sistemas para guardar la data histórica, quizás un Datawarehouse (diferente a los sistemas de operación o gestión de operación, donde la transaccionalidad es alta).

Información resumida de esta clase
#EstudiantesDePlatzi

  • Scripts es la herramienta de PgAdmin para insertar, modificar y borrar datos

  • Con Insert Script puedo agregar datos a una tabla

  • Con Create Script puedo crear una tabla

  • Con Update Script puedo hacer cambios en la información dentro de una tabla

la interfaz a vece es algo complicada, pero a la ves también sencilla

Muy buenas las explicaciones. Por ahora vengo bien encarrilado 😜

Que buen ejemplo el que tiro el profe para las relaciones de tablas

Importante acotar que la modificación de un tipo de dato en una columna se puede realizar solamente cuando la tabla está vacía, sino, podría generar conflicto de compatibilidad con los datos ya cargados para esa columna.

Para asegurarme que estoy insertando un ID referido existente cuando usamos foreing key.
Puedo hacer cosas como:
INSERT INTO bar (description, foo_id) VALUES ( ‘testing’, (SELECT id from foo WHERE type=‘blue’) ).
Donde:
La columna “foo_id” de la tabla “bar” es la columna local (la que tiene la foreign key).
La tabla referida es “foo” y la columna referida es “id”.
Fuente:
https://dba.stackexchange.com/questions/46410/how-do-i-insert-a-row-which-contains-a-foreign-key/46415

Hola!
El planteamiento que hice para mi proyecto tiene peculiaridades interesantes que les quiero compartir. Basado en la red de transporte colectivo de trenes que hay en Ciudad de México, di de alta algunos ejemplos de trayectos, que se denominan líneas, los cuales son rutas estaticas que siguen los trenes en su día a día. Estas líneas son bidireccionales, por lo que, el origen y el destino dependiendo de su orientación, hacen que una línea en realidad sean dos.
Ahora, además de eso, existen estaciones que comunican líneas entre si, lo que se conoce como trasbordos. Y como esas estaciones ocurren de igual forma en líneas bidireccionales, pues su existencia en la definición de las líneas es mayor a 2 en todos los casos.
Para darle orden a las líneas, ya que no use IDs numéricos, sino de tipo UUID, agregué un campo de ordenamiento que da tambien el sentido de las estaciones.

Por ejemplo, las estaciones en una línea, se ven como sigue:

Mientras que, para la misma línea pero en sentido contrario, se ven asi:

Nótese que existe una condición en la consulta que ordena no por ID, sino por el valor asignado a la linea con respecto a su continuidad y su sentido.

Y por ejemplo, las estaciones de trasbordo lucen de la siguiente manera:

El proyecto esta siendo muy ilustrativo, sugiero encarecidamente que se realice bajo planteamientos propios y se piense en un problema a resolver. Creo que eso da mayor panorama y una practica mas consciente y profunda.

Saludos!

Este curso es un buen F5 de los demás cursos de SQL.

Hola! aqui mi ejercicio de viajes agregando la funcion NOW() para “rellenar” los campos inicio y fin.

2 pasajeros

3 trenes

2 estaciones

Luego para cada pasajero inserté un viaje y utilicé la funcion NOW() para simular el inicio (fin = inicio)

Finalmente actualicé el campo fin de cada viaje con la funcion NOW()

Lo siguiente sería calcular el tiempo que dura cada viaje.

En caso de que quieran o necesiten varios registros pasa sus tablas, les recomiendo esta pagina la cual genera hasta 10.000 registros de cualquier ámbito.
https://mockaroo.com/

Tabla Viaje

tabla pasajeros




La facilidad que nos da SQL para insertar datos y consultas

Hay alguna otra herramienta gráfica para hacer queries?

A mi el pgAdmin se me bloquea.

la magia del update y delete cascade

La verdad ahora que estoy aprendiendo SQL, no veo tan complicado esto, todo es muy intuitivo

Añadí dos viajeros y les hice su registro de viajes, no tuve ningún problema con actualizar sus datos ni de los datos del viajero ni de Id, de echo cambié todos los datos del viajero y me funcionó de maravilla.

super bien explicado me, muy bueno le contenido los vídeos son cortos pero se entiende lo que explica

Aqui algunas insersiones

INSERT INTO public.pasajero(
	nombre, direccion_residencia, fecha_nacimiento)
	VALUES ('Alejandro Mota', 'EDO Mex, Cusil V' , '1985-06-26');
	select * from public.pasajero;```

Listo!

Alguien mas siente que no tiene sentido que un trayecto tenga como atributo una sola estacion? Un trayecto no se deberia componer de una estacion inicial y otra final?

aqui

Para realizar un insert en nuestras tablas desde PgAdmin hacemos clic derecho en la tabla->Script->Insert Scritp

Sí tenemos un ID serial, cuando tengamos insert podemos quitarlo del script insert porque el mismo motor de base de datos se encarga de asignar este número

Para modificar un tipo de dato en una columna se debe tomar en cuenta que el motor de B.D nos dejará hacer el cambio por un tipo de dato equivalente. Sí se desea cambiar el tipo de dato por my distinto seguramente se tendrá que hacer un drop column y luego un add column

Sí sé una acción como: borrar, actualizar en una registro que está en la tabla a y la llave primaria de esa misma se referencia en otra tabla b, y tenemos la opción ON CASCADE está acción actualizará el registro que está relacionado por medio del id

Increible clase

Podemos consultar datos con: View/Edit Data

Insertar datos a través de pgAdmin: Selección de la tabla + clic derecho / Scripts / INSERT Script

Para modificar un tipo de dato: En Properties borramos la columna y la creamos de nuevo.

Borrar y añadir una columna con Queries: ALTER TABLE ... DROP COLUMN / ALTER TABLE ... ADD COLUMN

Borrar un dato pgAdmin: Scripts / DELETE Script

Borran con Queries: DELETE FROM ... WHERE 'condición'

Cambiar un dato: Scripts / UPDATE Script

Interesante clase!

Es muy fácil de manejar con la interfaz, excelente

Hasta ahora todo super!!

Es muy sencillo de utilizar PostgreSQL con la interfaz, aunque también el manejo con consola es buena

Informacion lista!

![](

Muy bien explicado.