Page 1 of 1

Añadir un registro

Posted: Thu Apr 04, 2019 11:20 pm
by XeviCOMAS
Me estoy peleando en como hacer para insertar un registro en medio de una tabla.
Suponiendo que tengo una tabla con 11 registros

id cod descripcion
1 110 Pepe
2 111 Pepa
3 121 Juan
4 122 Juana
5 131 Jose
6 141 Emilio
7 142 Emilia
8 151 Fernando
9 152 Fernanda
10 161 Mario
11 162 Maria

Bien, EN ORDEN NATURAL de creación de la Tabla, quiero añadir un registro, cod 132 y descripción Josefa

Como puedo hacer para insertar un registro y que los registros por debajo del id 5 se "corran" una posición para que pueda poner el valor de ese nuevo registo en el id 6 ???

No se si me explico.

En una o varias sentencias Execute() algo así como...
INSERT INTO mitabla (cod,descripcion) VALUES ('000','nuevo'')
UPDATE mitabla SET cod = cod_registro_anterior, descripcion = descripcion_registro_anterior WHERE id > 5

y luego ya hacer
UPDATE mitabla SET cod = '132', descripcion = 'Josefa' WHERE id = 6

Alguien puede hecharme una mano ???

Re: Añadir un registro

Posted: Fri Apr 05, 2019 9:31 am
by jfgimenez
Xevi,

UPDATE mitabla SET cod=cod+1 WHERE cod>=132
INSERT INTO mitabla (cod,descripcion) VALUES (132,'Josefa')

Re: Añadir un registro

Posted: Fri Apr 05, 2019 10:25 am
by XeviCOMAS
Gracias José,

De la manera que propones, el registro 6 Josefa se añadirà al final de la Tabla, con el id 12... no???
No es así... yo quiero que el id 12 tome los datos del registro del id 11, los del 11 los tome del 10... i así hasta el 6
Y el id 6 hago el UPDATE con los datos del registro 132 Josefa


El resultado final que deseo obtener, es el orden "natural" de la tabla de esta forma

id cod descripcion
1 110 Pepe
2 111 Pepa
3 121 Juan
4 122 Juana
5 131 Jose
6 132 Josefa
7 141 Emilio
8 142 Emilia
9 151 Fernando
10 152 Fernanda
11 161 Mario
12 162 Maria


Gracias por vuestro tiempo.

Re: Añadir un registro

Posted: Fri Apr 05, 2019 10:33 am
by ignacio
Buenos días,

Muy mala idea lo del orden natural. Eso no existe en SQL. Si quieres tener una ordenación por registro de entrada, pon un timestamp.

Es muy probable que el motor utilice mecanismos de recuperación de registros borrados o sencillamente de reetructuración de la tabla en base a su clave primaria y tu ordenación natural se vaya al traste.

Un saludo

Re: Añadir un registro

Posted: Sat Apr 06, 2019 9:21 pm
by XeviCOMAS
Al final, como lo necesito si o si "orden natural", por compatibilidad con otras funciones que utilizo...

Code: Select all

      aItems := :QueryArray( "SELECT cod,descripcion FROM miBBDD.miTabla;" )
      HB_AIns( aItems, 6, { 132, 'Josefa' }, .T. )
      For n:=1 TO Len(aItems)
         cValues += IF( n>1, ",", "" ) + Chr(10) + "(" + aItems[n,2] + ", '" + aItems[n,3] ")"
      Next

      :Execute( "TRUNCATE miBBDD.miTabla;" )
      :Execute( "INSERT INTO miBBDD.miTabla (cod,descripcio) VALUES " + cValues )


Si hay alguna solución/aporte que se pueda mejorar, agradeceria cualquier sugerencia.

De momento, me vale/sirve de esta forma.

Gracias por vuestro tiempo.

Re: Añadir un registro

Posted: Mon Apr 08, 2019 8:42 pm
by jfgimenez
XeviCOMAS wrote:Al final, como lo necesito si o si "orden natural", por compatibilidad con otras funciones que utilizo...


Como te ha dicho Ignacio, el "orden natural" no existe en SQL. Es más, ese "orden natural" rompe uno de los principìos del modelo relacional de bases de datos.

Si lo que necesitas es un campo al estilo de los recno() de los DBF, lo que puedes hacer es crear un campo autoincremental. En el caso de SQLite, ya existe uno por defecto, que se llama _RowId_, y en MariaDB lo puedes crear tú muy fácilmente.