Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

insercción automática de registros en navicat

Estas en el tema de insercción automática de registros en navicat en el foro de Mysql en Foros del Web. Buenas a todos! Necesito duplicar cada registro de una tabla modificando solo dos datos y el resto identicos al registro duplicado, hay alguna manera autómatica ...
  #1 (permalink)  
Antiguo 01/06/2009, 02:14
 
Fecha de Ingreso: octubre-2007
Mensajes: 130
Antigüedad: 16 años, 6 meses
Puntos: 2
insercción automática de registros en navicat

Buenas a todos!
Necesito duplicar cada registro de una tabla modificando solo dos datos y el resto identicos al registro duplicado, hay alguna manera autómatica de hacerlo? estoy trabajando desde Navicat. Muchas gracias!!!
  #2 (permalink)  
Antiguo 01/06/2009, 02:46
 
Fecha de Ingreso: octubre-2007
Mensajes: 130
Antigüedad: 16 años, 6 meses
Puntos: 2
Respuesta: insercción automática de registros en navicat

He encontrado algo:
Cita:
INSERT INTO dns_recs
SELECT
dns_zone_id,
'MX',
'server',
'server',
displayVal,
val,
'20',
time_stamp
FROM dns_recs_2
WHERE opt='10' and type='MX'
pero el problema es que me duplica el id, se lo he quitado de la select ya que es autoincrementable, pero no lo reconoce, necesita un valor para insertar....

Última edición por auri501; 01/06/2009 a las 03:27
  #3 (permalink)  
Antiguo 01/06/2009, 03:30
 
Fecha de Ingreso: octubre-2007
Mensajes: 130
Antigüedad: 16 años, 6 meses
Puntos: 2
Respuesta: insercción automática de registros en navicat

Esto sería una solución, lo que intento hacer es sumarle 1 al ultimo id de la tabla....., pero no sé como hacerlo directamente en mysql en navicat....
Cita:
INSERT INTO
dns_recs
SELECT
id+1,
dns_zone_id,
type,
displayHost,
host,
'server',
'server',
'20',
time_stamp
FROM dns_recs
WHERE opt='10' and type='MX'
  #4 (permalink)  
Antiguo 01/06/2009, 05:09
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: insercción automática de registros en navicat

Explícate un poco, porque duplicar registros (viola la consistencia esperada en las BB.DD.), sólo cambiando dos datos, es al menos un poco extraño. Y duplicarlos modificando un campo PK es algo que no tiene sentido en Bases de Datos (viola la integridad referencial y la consistencia de datos).
Sería mejor que nos explicaras el tema, porque aunque se pueda hacer, hay que ver si es lo que se debe hacer, y no otra cosa.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 01/06/2009, 05:18
 
Fecha de Ingreso: octubre-2007
Mensajes: 130
Antigüedad: 16 años, 6 meses
Puntos: 2
Respuesta: insercción automática de registros en navicat

Hola gnzsoloyo, gracias por tu respuesta.

Me explico mejor, tenemos una tabla que contiene registros de configuraciones, y necesitamos agregar una configuración especial que consiste en la duplicidad de unos registros ya existentes en esa tabla pero variando el valor de dos campos. Realmente no quisiera modificar la pk de ningún campo ya existente, sino darle la suya propia al nuevo registro insertado, pero de la manera que lo tengo creado me inserta el id del producto que quiero duplicar.
  #6 (permalink)  
Antiguo 01/06/2009, 05:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: insercción automática de registros en navicat

Bien,analicemos lo que describes:
La tabla en cuestión contiene configuraciones de equipos datos, es decir: la tabla controla un producto y configuración, pero esta configuración tien o bien componentes opcionales, o bien configuraciones alternativas.
¿Es así?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 01/06/2009, 05:44
 
Fecha de Ingreso: octubre-2007
Mensajes: 130
Antigüedad: 16 años, 6 meses
Puntos: 2
Respuesta: insercción automática de registros en navicat

No entiendo muy bien a que te refieres con componentes opcionales o configuraciones alternativas... te explico un poco más sobre la estructura de mi bdd. Todos los campos de la tabla deben tener datos y son configuraciones de dns de todos los dominios de un servidor bajo plesk... estamos viendo la manera de hacerlo sin tener que cambiar uno a uno este registro desde el panel plesk.

mi tabla contiene los siguientes campos:
id,dns_zone_id,type,displayHost,host,val,displayVa l,op,time_stamp

y necesito duplicar solo unos datos, los que cumplan la siguiente condicion:

WHERE opt='10' and type='MX'

y cambiar el valor de los campos val,displayVal,opt de los registros duplicados... creo que es factible hacerlo ya que realmente no es una duplicidad en si, es una insercción de un nuevo registro.... muchas gracias por tu interes!!!
  #8 (permalink)  
Antiguo 01/06/2009, 06:53
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: insercción automática de registros en navicat

Queda un poco más claro el problema.
Entonces la cosa es así:
- Tienes una tabla de datos que contiene información de dominios con este contenido (aproximadamente):
Cita:
DOMINIO_PLESK(id, dns_zone_id, type, displayHost, host, val, displayVa l, op, time_stamp)
.
- Quieres cambiar tres valores solamente (val, displayVa l, op), pero sin perder los datos que ya existen.
- El ID es numérico, lo que implica que lo han declarado o como auto_increment, o lo pone el sistema. En cualquiera de los dos casos el problema es que existe al menos un conjunto de datos de la tabla que no deben repetirse, ya que son determinantes de la identidad de la instancia (supongamos: dns_zone_id, type, displayHost, host, time_stamp).
- En estas condiciones, cualquier duplicidad de datos en esos tres campos producirá una violación de la normalización de la tabla (1FN). Lo que se debe hacer, si se quiere evitar problemas de consistencia, es enviar esos tres valores a una tabla independiente, ponerle clave propia y en la tabla principal poner un campo FK referido a ese registro de la segunda tabla.
Esto permitiría con un sólo SELECT con INNER JOIN obtener todos los registros de cada dominio y host, que tengan más de un conjunto de valores en esos tres campos.

SI lo que se desea es reemplazar sin conservar, el asunto es hacer un UPDATE, no un INSERT.

¿Se comprende la idea?
¿Me estoy acercando a lo que preguntas?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 01/06/2009, 07:37
 
Fecha de Ingreso: octubre-2007
Mensajes: 130
Antigüedad: 16 años, 6 meses
Puntos: 2
Sonrisa Respuesta: insercción automática de registros en navicat

Muchas gracias de nuevo por tu rapida respuesta gnzsoloyo. Es eso exactamente lo que quiero hacer, lo has entendido a la perfeccion, el problema es que no podemos alterar la estructura de las tablas porque es una aplicación externa a nosotros... solo podemos cambiar los datos de las tablas.

El propio programa al crear un nuevo registro, lo crea de esa manera, duplica los datos generando un nuevo registro modificando solo esos tres campos que yo necesito cambiar, por lo que entiendo que aunque no sea correcto al estar así estructurada la bdd pues no podemos hacer otra cosa que duplicar el registro. Lo que necesitaria es hacer la select que he puesto al principio pero me da el error de la pk. La solución seria sumar 1 a la última pk, pero no sé como hacer eso.....

No sé si me he explicado, es un poco complicado explicar por aquí ya que no es una bdd que pueda modificar a mi antojo... muchas gracias por todo.
  #10 (permalink)  
Antiguo 01/06/2009, 08:13
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: insercción automática de registros en navicat

Cita:
La solución seria sumar 1 a la última pk, pero no sé como hacer eso.....
Si la PK se está poniendo automáticamente, no es posible sin tener control del INFORMATION_SCHEMA.TABLES. Si quieres mantener ese esquema, la única posibilidad es hacerlo en dos etapas.
1) Tienes que recuperar el valor del máximo ID de la tabla en el campo:
Código SQL:
Ver original
  1. SELECT `auto_increment`
  2. FROM information_schema.`TABLES` T
  3. WHERE TABLE_NAME = 'NOMBRE_TABLA';
.
2) Una vez recuperado el conjunto del registro, usar ese valor de l campo `auto_increment` sumandole 1, y enviar el registro completo (incluyendo el ID).
Si intentas enviar el mismo ID del registro original sumando 1, eso funcionará solamente si ese registro es el último ingresado. Sino, siempre habrá uno posterior y lo estarías pisando.

Aún con todo esto, ten en cuenta que es muy posible que esto te genere a la alarga problemas de consistencia, si el ID de la tabla se usa como FK en alguna parte del sistema...
Y a medida que se vayan agregando, es posible que algunas consultas en funcionamiento en la actualidad, colapsen sin remedio.

Esto es sólo un "parche". Tienen que reforma si o si el sistema o eventualmente no funcionará.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 01/06/2009, 08:44
 
Fecha de Ingreso: octubre-2007
Mensajes: 130
Antigüedad: 16 años, 6 meses
Puntos: 2
Respuesta: insercción automática de registros en navicat

El sistema es plesk, no sé si has oido hablar de él... es un panel de control para gestionar las configuraciones de los servidores. No tenemos acceso al codigo fuente de plesk ya que es un programa privado, solo tenemos acceso al contenido de la bdd y hemos visto que al crear desde su panel de control una nueva dns crea este tipo de registro en esta tabla, es por eso que lo vamos a hacer así, y funciona perfectamente. El código que me has pasado:

Cita:
SELECT `auto_increment`
FROM information_schema.`TABLES` T
WHERE TABLE_NAME = 'NOMBRE_TABLA';
me viene genial para el valor que necesito, pero no sé como incluirlo en la select que tengo creada:

Cita:
INSERT INTO
dns_recs
SELECT
(valor de la select anterior),
dns_zone_id,
type,
displayHost,
host,
'server',
'server',
'20',
time_stamp
FROM dns_recs
WHERE opt='10' and type='MX'

y como puedo usar dos select en mi consulta?? porque necesito esta para el id, pero también necesito la otra para los valores de mi nuevo registro:
Código PHP:
INSERT INTO
dns_recs
SELECT
id
+1,
dns_zone_id,
type,
displayHost,
host,
'server',
'server',
'20',
time_stamp
FROM dns_recs
WHERE opt
='10' and type='MX' 
  #12 (permalink)  
Antiguo 01/06/2009, 09:00
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: insercción automática de registros en navicat

Una forma muy rústica de hacerlo sería:
Código sql:
Ver original
  1. INSERT INTO  dns_recs
  2. SELECT
  3.       ((SELECT `auto_increment` FROM information_schema.`TABLES` T WHERE TABLE_NAME = 'dns_recs')+1),
  4.       dns_zone_id,
  5.       TYPE,
  6.       displayHost,
  7.       host,
  8.       'server',
  9.       'server',
  10.       '20',
  11.       time_stamp
  12. FROM dns_recs
  13. WHERE opt='10' AND TYPE='MX';
Esta forma lo que hace es conservar el registro anterior y crear uno nuevo. No me queda claro para qué quieres una doble consulta, que por otro lado a nivel de SQL no es posible en el contexto de un INSERT.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 02/06/2009, 01:50
 
Fecha de Ingreso: octubre-2007
Mensajes: 130
Antigüedad: 16 años, 6 meses
Puntos: 2
Respuesta: insercción automática de registros en navicat

He creado este insert:
Cita:
INSERT INTO dns_recs
SELECT
( SELECT auto_increment
FROM information_schema.`TABLES` T
WHERE TABLE_NAME = 'dns_recs'),
dns_zone_id,
type,
displayHost,
host,
'server',
'server',
'20',
time_stamp
FROM dns_recs
WHERE opt='10' AND type='MX';
pero la segunda select que recoge el último id insertado parece que siempre me coge el mismo porque me aparece el error "Duplicate entry '526' for key 1", he intentado: SELECT auto_increment + 1 pero como siempre recoge el mismo valor tampoco funciona......
  #14 (permalink)  
Antiguo 02/06/2009, 05:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: insercción automática de registros en navicat

No te deja ingresarlo, porque esto:
Código sql:
Ver original
  1. SELECT AUTO_INCREMENT
  2. FROM information_schema.`TABLES` T
  3. WHERE TABLE_NAME = 'dns_recs'
te devuelve el último ID que ya se usó.
Por eso la sintaxis que usé era:
Código sql:
Ver original
  1. ((SELECT `auto_increment`
  2. FROM information_schema.`TABLES` T
  3. WHERE TABLE_NAME = 'dns_recs')+1)
Ahora bien, -este método sólo sirve para ingresar un registro, no para ingresar varios al mismo tiempo. Al menos no o he probado para eso.
Si quieres otro método que te puede ingresar varios, entonces hay que plantear el asunto de otra forma.
¿Cómo harás las inserciones?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:15.