INSERT SET o INSERt VALUES

User avatar
sysctrl2
Posts: 833
Joined: Mon Feb 05, 2007 7:15 pm
Contact:

INSERT SET o INSERt VALUES

Post by sysctrl2 »

Cual es la diferencia entre.

"INSERT INTO clientes SET "
y
"INSERT INTO clientes ( field1. field2. field3) VALUES "

hablando concretamente de MySql y DOLPHIN


saludos..
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
horacio
Posts: 1270
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: INSERT SET o INSERt VALUES

Post by horacio »

Por lo que tengo entendido son dos forma de hacer un insert con resultados idénticos.

Saludos
User avatar
sysctrl2
Posts: 833
Joined: Mon Feb 05, 2007 7:15 pm
Contact:

Re: INSERT SET o INSERt VALUES

Post by sysctrl2 »

gracias,
algún otro comentario ?
saludos.
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
Willi Quintana
Posts: 859
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú
Contact:

Re: INSERT SET o INSERt VALUES

Post by Willi Quintana »

Hola,,,
Sintaxis pata INSERT
INSERT INTO productos (campo1, campo2, campo3) VALUES (var1, car2, var3) WHERE <condición>
Para UPDATE
UPDATE productos SET campo1 = var1, campo2 = var2, campo3 = var3 WHERE <condición>
User avatar
joseluisysturiz
Posts: 2024
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela
Contact:

Re: INSERT SET o INSERt VALUES

Post by joseluisysturiz »

INSERT inserta nuevas filas en una tabla existente. Los formatos INSERT ... VALUES e INSERT ... SET, insertas filas basándose en los valores especificados explícitamente. El formato The INSERT ... SELECT inserta filas seleccionadas de otra tabla o tablas. El formato INSERT ... VALUES con una lista de múltiples valores está soportada por MySQL desde la versión 3.22.5. La sintaxis INSERT ... SET está soportada por MySQL desde la versión 3.22.10...saludos... :shock:

http://mysql.conclase.net/curso/?sqlsen=INSERT
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Re: INSERT SET o INSERt VALUES

Post by Armando »

César:

Paisano, como te han mencionado es lo mismo pero no es igual (Parafraseando a Vicente Fernández) :)

A mi me agrada más la opción con SET pues me permite ver el par de campo y su correspondiente
valor a insertar.

Code: Select all

                        cCmdSql := "INSERT INTO " +;
                                            "Fijos " +;
                                        "SET " +;
                                            "Fij_Cia = '" + STR(oRsEmp:Fields("EMP_CIA"):Value,02,0) + "'," +;
                                            "Fij_Emp = '" + STR(oRsEmp:Fields("EMP_EMP"):Value,05,0) + "'," +;
                                            "Fij_Con = '" + STR(nCpto,03,0) + "'," +;
                                            "Fij_Vec    = '" + STR(nUnidad,05,2) + "'," +;
                                            "Fij_Cal = 1" + "," +;
                                            "Fij_Sdi    = '" + STR(nSdi,11,2) +"'," +;
                                            "Fij_Sdv    = '" + STR(nSdv,11,2) +"'"

 
Mientras que con la otra sintaxis se puede uno perder sobre todo cuando son muchos los pares de
campo/valor.

Cual es la mejor?, la que te acomode !.

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
sysctrl2
Posts: 833
Joined: Mon Feb 05, 2007 7:15 pm
Contact:

Re: INSERT SET o INSERt VALUES

Post by sysctrl2 »

Jose Luis,
GRACIAS, MUY CLARO,

Paisa, gracias,

se me presenta el sig. caso.

Code: Select all

#include "fivewin.ch"
#include <tdolphin.ch>

#DEFINE C_SIMPLE CHR( 39 )
#DEFINE c_simple CHR( 39 )


Function Test()
    local aNombres 
    local i
    local cInsertQry := ""
    local cQry
    aadd( aNombres, {"001", "NOMBRE 1"} )
    aadd( aNombres, {"002", "NOMBRE 2"} )
    aadd( aNombres, {"003", "NOMBRE 3"} )
    aadd( aNombres, {"004", "NOMBRE 4"} )
    aadd( aNombres, {"005", "NOMBRE 5"} )
    aadd( aNombres, {"006", "NOMBRE 6"} )
    aadd( aNombres, {"007", "NOMBRE 7"} )
    aadd( aNombres, {"008", "NOMBRE 8"} )
    aadd( aNombres, {"009", "NOMBRE 9"} )
    aadd( aNombres, {"010", "NOMBRE 10"} )

    // PRIMERO TOMAR LOS VALORES
    //  PARA QUE SEA MAS RAPIDO EL CICLO FOR
       // estamos hablando de que los arreglos pueden contener desde 100 o hasta 20 mil registros

    for i := 1 to len( aNombres )
        cQry := "INSERT INTO clientes SET "
        cQry += "clave="          + ClipValue2SQL( aNombres[i][1] )  + ","
        cQry += "nombre="         + ClipValue2SQL( aNombres[i][2] )
        cInsertQry += cQry + ";"        
    NEXT

    //AQUI QUIERO AGREGAR LOS REGISTROS AL FINAL DE
    //DE RECORRER EL CICLO

    // pero NO FUNCIONA !!! mysql con dolphin
    // no marca error ni nada simplemente no inserta los 
    // registros.

    TRY
        oCon:Execute( cInsertQry )
    CATCH
    END

      // ACLARO TENGO MYSQL. 5.0  
     // GRACIAS.. SALUDOS..


return nil
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
joseluisysturiz
Posts: 2024
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela
Contact:

Re: INSERT SET o INSERt VALUES

Post by joseluisysturiz »

sysctrl2 wrote:Jose Luis,
GRACIAS, MUY CLARO,

Paisa, gracias,

se me presenta el sig. caso.

Code: Select all

#include "fivewin.ch"
#include <tdolphin.ch>

#DEFINE C_SIMPLE CHR( 39 )
#DEFINE c_simple CHR( 39 )


Function Test()
    local aNombres 
    local i
    local cInsertQry := ""
    local cQry
    aadd( aNombres, {"001", "NOMBRE 1"} )
    aadd( aNombres, {"002", "NOMBRE 2"} )
    aadd( aNombres, {"003", "NOMBRE 3"} )
    aadd( aNombres, {"004", "NOMBRE 4"} )
    aadd( aNombres, {"005", "NOMBRE 5"} )
    aadd( aNombres, {"006", "NOMBRE 6"} )
    aadd( aNombres, {"007", "NOMBRE 7"} )
    aadd( aNombres, {"008", "NOMBRE 8"} )
    aadd( aNombres, {"009", "NOMBRE 9"} )
    aadd( aNombres, {"010", "NOMBRE 10"} )

    // PRIMERO TOMAR LOS VALORES
    //  PARA QUE SEA MAS RAPIDO EL CICLO FOR
       // estamos hablando de que los arreglos pueden contener desde 100 o hasta 20 mil registros

    for i := 1 to len( aNombres )
        cQry := "INSERT INTO clientes SET "
        cQry += "clave="          + ClipValue2SQL( aNombres[i][1] )  + ","
        cQry += "nombre="         + ClipValue2SQL( aNombres[i][2] )
        cInsertQry += cQry + ";"        
    NEXT

    //AQUI QUIERO AGREGAR LOS REGISTROS AL FINAL DE
    //DE RECORRER EL CICLO

    // pero NO FUNCIONA !!! mysql con dolphin
    // no marca error ni nada simplemente no inserta los 
    // registros.

    TRY
        oCon:Execute( cInsertQry )
    CATCH
    END

      // ACLARO TENGO MYSQL. 5.0  
     // GRACIAS.. SALUDOS..


return nil
Si quieres que grabe cada registro dentro del for..debes agregar el execute..recuerde que ese es el que te EJECUTA el comando mysql..asi lo tengo y funciona perfecto, tambien prueba quitando el ultimo ";", saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
sysctrl2
Posts: 833
Joined: Mon Feb 05, 2007 7:15 pm
Contact:

Re: INSERT SET o INSERt VALUES

Post by sysctrl2 »

Jose Luis,

de echo lo tengo asi, los registros los agrego dentro del FOR NEXT de uno por uno,

pero cuando son muchos elementos en el array, se hace lenta la inserción de registros

yo quiero ver si primero recorro el for next , poniendo las variables en un STRING

y al final agregarlos a la tabla,

se podrá hacer eso ?

gracias.
saludos..
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
joseluisysturiz
Posts: 2024
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela
Contact:

Re: INSERT SET o INSERt VALUES

Post by joseluisysturiz »

Lo que seria es hacer un query como cuando se hacen respaldo de tablas y restauracion, aunque creo que al final seria casi igual, si vas hacer 2 procesos, yo te recomendaria que hicieras el insert y el execute dentro del for next, asi aseguraria la carga de los registros, igual va a tardar y cargar un array con tantos registros, te podria causar inconsistencia en los datos, has ambos metodos y calculalos con un timer haber cual te lleva menos tiempo...yo insisto en INSERT / EXECUTE dentro de FOR NEXT y podiras hasta colocar un oMeter...saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
sysctrl2
Posts: 833
Joined: Mon Feb 05, 2007 7:15 pm
Contact:

Re: INSERT SET o INSERt VALUES

Post by sysctrl2 »

Los registros los tomo de un archivo de texto plano,
es muy rápido el while ! oTxt:Eof()
actualmente lo hago como dices
pero pensé si habría otra forma de hacerlo mas rápido,
quizás un PROCEDURE que corra dentro del mismo server,

saludos.
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
joseluisysturiz
Posts: 2024
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela
Contact:

Re: INSERT SET o INSERt VALUES

Post by joseluisysturiz »

Revisando he visto algo...veo que tienes el Insert dentro del for..next...eso quiere decir que va a realizar un insert por cada registro, eso haria lentitud, si quieres crear un scrip con todos los registros pero un solo Insert prueba dejando el insert fuera del for y que se concatenen los valores...algo como esto, saludos... :shock:

Code: Select all


  cQry := "INSERT INTO clientes SET "
for i := 1 to len( aNombres )
        cQry += "clave="          + ClipValue2SQL( aNombres[i][1] )  + ","
        cQry += "nombre="         + ClipValue2SQL( aNombres[i][2] )
        cInsertQry += cQry + ";"       
    NEXT

TRY
        oCon:Execute( cInsertQry )
    CATCH
    END
 
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
fgondi
Posts: 636
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España
Contact:

Re: INSERT SET o INSERt VALUES

Post by fgondi »

Te falta los retornos de carro.

Code: Select all

  for i := 1 to len( aNombres )
        cQry := "INSERT INTO clientes SET "
        cQry += "clave="          + ClipValue2SQL( aNombres[i][1] )  + ","
        cQry += "nombre="         + ClipValue2SQL( aNombres[i][2] )
        cInsertQry += cQry + ";" + chr(13)+chr(10)      
    NEXT
Sin ellos la cadena que quieres ejecutar quedaría así:

Code: Select all

INSERT INTO Clientes SET clave="001",nombre="NOMBRE 1";INSERT INTO clientes SET clave="02",nombre="NOMBRE 2";
Aunque no se vea el código sql a ejecutar, a mi me gusta colocarlo:

Code: Select all

  for i := 1 to len( aNombres )
        cQry := "INSERT INTO clientes SET " + chr(13)+chr(10)  
        cQry += "clave="     + ClipValue2SQL( aNombres[i][1] ) + "," + chr(13)+chr(10)  
        cQry += "nombre="  + ClipValue2SQL( aNombres[i][2] ) + ";" + chr(13)+chr(10)
        cInsertQry += cQry + chr(13)+chr(10)  
    NEXT
Igual que lo grabo en la variable, quiero que aparezca en la sentencia sql.
Además añado otro retorno de carro, entre cada instrucción insert para separlo.

El resultado sería:

Code: Select all

INSERT INTO Clientes SET 
clave="001",
nombre="NOMBRE 1";

INSERT INTO clientes SET 
clave="02",
nombre="NOMBRE 2";
Un saludo
Fernando González Diez
ALSIS GHE Sistemas Informáticos
User avatar
fgondi
Posts: 636
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España
Contact:

Re: INSERT SET o INSERt VALUES

Post by fgondi »

En cuanto a la instrucción sql que ejecutas, desconozco si mysql funciona, pero creo que está mal escrita.

el comando "SET" se usa para actualizar los registros (UPDATE)
Para usar "INSERT INTO" tendrías estas posibilidades

Code: Select all

INSERT INTO clientes (Clave, Nombre) Values ('01', 'NOMBRE 1');
Añade un registro en tabla clientes, grabando en el campo "Clave" el valor "01" y en el campo "Nombre" el valor "NOMBRE 1"

Code: Select all

INSERT INTO clientes Values ('01', 'NOMBRE 1');
Sin especificar los valor que quieres actualizar "(Clave, Nombre)"
Añade un registro en tabla clientes y tenemos que indicar en "Values" todos _ que tenga la tabla, ordenando las columnas a incluir tal cual estén en la tabla "clientes"
En el ejemplo: La tabla clientes tendría que tener sólo 2 campos y además tendrían que estar creados con el campo "Clave" primero y "Nombre" después.
Si la tabla, cuando se creó, se incluyo primero el campo "nombre" y luego el campo "clave", daría error.

Code: Select all

INSERT INTO clientes (Clave, Nombre)
Select ... From "Otra tabla"
Where ...;
Igual que en los anteriores, añade registros a la tabla clientes, pero en este caso coge los valores de "Otra tabla".
Se puede quitar "(Clave, Nombre)", sabiendo, como comenté en el apartado anterior, que _ tendrán que estar ordenador tal cual están en la tabla "clientes".
Este método se usa cuando el registro que queremos añadir está en otra tabla, evitamos tener que pasarlo a variables para luego insertarlo en "clientes".
Además puede añadir mas de un registro. Añade todos los registros que devuelva la consulta ( Select ... From "Otra tabla" Where ... )
Un saludo
Fernando González Diez
ALSIS GHE Sistemas Informáticos
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: INSERT SET o INSERt VALUES

Post by Carlos Mora »

César,

¿Y si pruebas con esto?

Code: Select all

    #include "fivewin.ch"
    #include <tdolphin.ch>

    #DEFINE C_SIMPLE CHR( 39 )
    #DEFINE c_simple CHR( 39 )


    Function Test()
        local aNombres
        local i
        local cInsertQry := ""
        local cQry
        aadd( aNombres, {"001", "NOMBRE 1"} )
        aadd( aNombres, {"002", "NOMBRE 2"} )
        aadd( aNombres, {"003", "NOMBRE 3"} )
        aadd( aNombres, {"004", "NOMBRE 4"} )
        aadd( aNombres, {"005", "NOMBRE 5"} )
        aadd( aNombres, {"006", "NOMBRE 6"} )
        aadd( aNombres, {"007", "NOMBRE 7"} )
        aadd( aNombres, {"008", "NOMBRE 8"} )
        aadd( aNombres, {"009", "NOMBRE 9"} )
        aadd( aNombres, {"010", "NOMBRE 10"} )

        // PRIMERO TOMAR LOS VALORES
        //  PARA QUE SEA MAS RAPIDO EL CICLO FOR
           // estamos hablando de que los arreglos pueden contener desde 100 o hasta 20 mil registros

         cQry := "INSERT INTO clientes (clave,nombre) VALUES  "
        for i := 1 to len( aNombres )
            cQry += "( "          + ClipValue2SQL( aNombres[i][1] )  + ","  + ClipValue2SQL( aNombres[i][2] ) + ")"
            IF i < Len( aNombres )
                cQry+= ','
        NEXT

        //AQUI QUIERO AGREGAR LOS REGISTROS AL FINAL DE
        //DE RECORRER EL CICLO

        // pero NO FUNCIONA !!! mysql con dolphin
        // no marca error ni nada simplemente no inserta los
        // registros.

        TRY
            oCon:Execute( cQry )
        CATCH
        END

          // ACLARO TENGO MYSQL. 5.0  
         // GRACIAS.. SALUDOS..


    return nil
 
con esto haces todo de un solo saque.
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Post Reply