2008-10-15 28 views
9

Claramente, lo siguiente es incorrecto.Seleccione de la misma tabla que Insertar o Actualizar

INSERT INTO `aTable` (`A`,`B`) VALUES((SELECT MAX(`A`) FROM `aTable`)*2),'name'); 

puedo obtener el valor:

consulta SQL:

INSERT INTO `aTable` (`A`, `B`) 
VALUES 
(
    (
    SELECT MAX(`A`) 
    FROM `aTable` 
) *2 
, 'name' 
) 

MySQL dijo:

1093 - No es posible especificar la tabla de destino 'unaTabla' para la actualización de cláusula

Por lo tanto, estoy tratando de hacer una tabla de mapa de bits, cada fila corresponde a un bit, y tiene un 'mapa' va lue.

Para insertar en la tabla, no quiero hacer dos consultas, quiero hacer una. ¿Cómo debo hacer esto?

Nadie comentó sobre esto, pero como estoy tratando de hacer un mapa de bits, debería ser * 2 not^2, mi error, tenga en cuenta que es por eso que los comentarios a menudo dicen^2, fue un error en el versión que los comentaristas leen.

Respuesta

10

intento:

insert into aTable select max(a)^2, 'name' from aTable; 

o

insert into aTable select max(a)^2, 'name' from aTable group by B; 

Si necesita una combinación, se puede hacer esto:

insert into aTable select max(a)^2, 'name' from aTable, bTable; 

Mi versión "Servidor" es "5.0.51b- community-nt MySQL Community Edition (GPL) "

1

Creo que debe soltar los "VALORES" y tener una declaración de selección válida.

see this link

No soy un tipo particular MySQL, MSSQL utilizo en su mayoría. Pero si formatea la declaración de selección correctamente, debería funcionar.

+0

No, estoy tratando de seleccionar desde la misma tabla que el inserto, y a MySQL no le gusta eso ... Sory, no había escrito la consulta correctamente la primera vez, pero el Select seguía siendo correcto . –

+0

hrm. De acuerdo, ¿MySQL tiene funciones definidas por el usuario? Entonces, ¿puede crear una función que devuelva el "MAX (' A') actual "y usarla en su extracto? – stephenbayer

+0

Lo hace (procedimientos almacenados) pero no estoy seguro de si te permitirá hacerlo todavía. Vale la pena intentarlo –

-1

tan pronto como la opción de selección sea correcta puede hacerlo.

+1

Si ejecuto la selección como una consulta en sí misma, funciona bien. –

5

Supongo que INSERT ... SELECT no está funcionando? Veo esto en la documentación para ello:

La tabla de destino de la sentencia INSERT puede aparecer en la cláusula DE de la parte SELECT de la consulta . (Esto no fue posible en algunas versiones anteriores de MySQL ). En este caso , MySQL crea una tabla temporal para contener las filas de SELECT y y luego inserta esas filas en la tabla de destino .

Por curiosidad, ¿qué versión de MySQL estás usando?

+0

La siguiente sugerencia sería, si está utilizando una versión anterior de MySQL, usar una tabla temporal, que es lo que hacen las versiones actuales de MySQL implícitamente. –

+0

..debe estar funcionando # Versión del servidor: 5.0.45-Debian_1ubuntu3.3-log # Versión del protocolo: 10 –

8

En realidad , puede alias la tabla en el inserto. He visto esta pregunta por todos lados, pero nadie parece haber intentado eso. Use una subconsulta para obtener el máximo de la tabla, pero alias la tabla en la subconsulta.

INSERT INTO tableA SET fieldA = (SELECT max(x.fieldA) FROM tableA x)+1; 

Un ejemplo más complejo, donde se tiene una clave secundaria correspondiente, y puede ser que insertar el primer registro de la clave secundaria correspondiente:

INSERT INTO tableA SET secondaryKey = 123, fieldA = COALESCE((SELECT max(x.fieldA) FROM tableA x WHERE x.secondaryKey = 123)+1,1); 

Por un alias a la mesa, no tira la error y parece funcionar. Acabo de hacer esto mientras codificaba algo, aunque no puedo ver si hay algún error de sintaxis arriba, probaría ese tipo de sintaxis.

Cuestiones relacionadas