FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour INSERT SET o INSERt VALUES
Posts: 1144
Joined: Mon Feb 05, 2007 07:15 PM
INSERT SET o INSERt VALUES
Posted: Wed Feb 11, 2015 08:44 PM

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 "
Posts: 1364
Joined: Wed Jun 21, 2006 12:39 AM
Re: INSERT SET o INSERt VALUES
Posted: Wed Feb 11, 2015 11:55 PM

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

Saludos

Posts: 1144
Joined: Mon Feb 05, 2007 07:15 PM
Re: INSERT SET o INSERt VALUES
Posted: Thu Feb 12, 2015 05:45 AM

gracias,
algún otro comentario ?
saludos.

Cesar Cortes Cruz

SysCtrl Software

Mexico



' Sin +- FWH es mejor "
Posts: 1054
Joined: Sun Oct 09, 2005 10:41 PM
Re: INSERT SET o INSERt VALUES
Posted: Thu Feb 12, 2015 10:49 PM

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>

Posts: 2064
Joined: Fri Jan 06, 2006 09:28 PM
Re: INSERT SET o INSERt VALUES
Posted: Fri Feb 13, 2015 12:11 AM

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!
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: INSERT SET o INSERt VALUES
Posted: Fri Feb 13, 2015 12:17 AM
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 (fw): Select all Collapse
                        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
Posts: 1144
Joined: Mon Feb 05, 2007 07:15 PM
Re: INSERT SET o INSERt VALUES
Posted: Fri Feb 13, 2015 12:24 AM
Jose Luis,
GRACIAS, MUY CLARO,

Paisa, gracias,

se me presenta el sig. caso.

Code (fw): Select all Collapse
#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 "
Posts: 2064
Joined: Fri Jan 06, 2006 09:28 PM
Re: INSERT SET o INSERt VALUES
Posted: Fri Feb 13, 2015 12:37 AM
sysctrl2 wrote:Jose Luis,
GRACIAS, MUY CLARO,

Paisa, gracias,

se me presenta el sig. caso.

Code (fw): Select all Collapse
#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... :-)
Dios no está muerto...



Gracias a mi Dios ante todo!
Posts: 1144
Joined: Mon Feb 05, 2007 07:15 PM
Re: INSERT SET o INSERt VALUES
Posted: Fri Feb 13, 2015 03:45 AM

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 "
Posts: 2064
Joined: Fri Jan 06, 2006 09:28 PM
Re: INSERT SET o INSERt VALUES
Posted: Fri Feb 13, 2015 04:22 AM

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!
Posts: 1144
Joined: Mon Feb 05, 2007 07:15 PM
Re: INSERT SET o INSERt VALUES
Posted: Fri Feb 13, 2015 04:30 AM

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 "
Posts: 2064
Joined: Fri Jan 06, 2006 09:28 PM
Re: INSERT SET o INSERt VALUES
Posted: Fri Feb 13, 2015 04:39 AM
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... :-)

Code (fw): Select all Collapse
  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!
Posts: 694
Joined: Fri Oct 07, 2005 06:58 AM
Re: INSERT SET o INSERt VALUES
Posted: Fri Feb 13, 2015 08:43 AM
Te falta los retornos de carro.

Code (fw): Select all Collapse
  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 (fw): Select all Collapse
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 (fw): Select all Collapse
  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 (fw): Select all Collapse
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 Sistemas Informáticos
Posts: 694
Joined: Fri Oct 07, 2005 06:58 AM
Re: INSERT SET o INSERt VALUES
Posted: Fri Feb 13, 2015 09:07 AM
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 (fw): Select all Collapse
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 (fw): Select all Collapse
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 los campos 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 (fw): Select all Collapse
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 los campos 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 Sistemas Informáticos
Posts: 989
Joined: Thu Nov 24, 2005 03:01 PM
Re: INSERT SET o INSERt VALUES
Posted: Fri Feb 13, 2015 09:31 AM
César,

¿Y si pruebas con esto?
Code (fw): Select all Collapse
    #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"