into mysql sql insert mysql-error-1093

mysql - into - Insertar y establecer valor con max()+1 problemas



insert max id+1 mysql (10)

Correcto, no puede modificar y seleccionar desde la misma tabla en la misma consulta. Debería realizar lo anterior en dos consultas separadas.

La mejor forma es usar una transacción, pero si no está utilizando las tablas de innodb, lo mejor será bloquear las tablas y luego realizar sus consultas. Asi que:

Lock tables customers write; $max = SELECT MAX( customer_id ) FROM customers;

Coge la identificación máxima y luego realiza la inserción

INSERT INTO customers( customer_id, firstname, surname ) VALUES ($max+1 , ''jim'', ''sock'') unlock tables;

Estoy tratando de insertar una nueva fila y establecer el customer_id con max () + 1. La razón para esto es que la tabla ya tiene un auto_increatment en otra columna llamada id y la tabla tendrá varias filas con el mismo id_cliente.

Con este:

INSERT INTO customers ( customer_id, firstname, surname ) VALUES ((SELECT MAX( customer_id ) FROM customers) +1, ''jim'', ''sock'')

... sigo recibiendo el siguiente error:

#1093 - You can''t specify target table ''customers'' for update in FROM clause

Además, ¿cómo podría detener la adición de 2 clientes diferentes al mismo tiempo y no tener el mismo id_cliente?


Declaramos una variable ''a''

SET **@a** = (SELECT MAX( customer_id ) FROM customers) +1; INSERT INTO customers ( customer_id, firstname, surname ) VALUES (**@a**, ''jim'', ''sock'')


El mío es un inserto, pero aquí es a lo que terminé usando las sugerencias aquí.

update m set m.host_id = max(h.host_id) from t_po_master as m inner join t_al_host_po_master as h on m.po_number = h.po_number where m.host_id is NULL and m.client_code = ''01''

EDITAR - Esto realmente no funcionó. No estoy seguro de por qué no, ya que al convertirlo en una declaración de selección, parece que funcionaría, pero esto actualizó todos los host_ids al mismo ID. Entonces no usaría esto es un buen ejemplo.


Ninguna de las respuestas funciona para mi caso. Obtuve la respuesta here , y mi SQL es:

INSERT INTO product (id, catalog_id, status_id, name, measure_unit_id, description, create_time) VALUES ( (SELECT id FROM (SELECT COALESCE(MAX(id),0)+1 AS id FROM product) AS temp), (SELECT id FROM product_catalog WHERE name="AppSys1"), (SELECT id FROM product_status WHERE name ="active"), "prod_name_x", (SELECT id FROM measure_unit WHERE name ="unit"), "prod_description_y", UNIX_TIMESTAMP(NOW()) )


No puede hacerlo en una sola consulta, pero puede hacerlo dentro de una transacción. Haga el MAX inicial () seleccione y bloquee la tabla, luego haga la inserción. La transacción asegura que nada interrumpirá las dos consultas, y el bloqueo asegura que nada más puede intentar hacer lo mismo en otro lugar al mismo tiempo.


Puede usar la INSERT ... SELECT para obtener el valor MAX()+1 e insertar al mismo tiempo:

INSERT INTO customers( customer_id, firstname, surname ) SELECT MAX( customer_id ) + 1, ''jim'', ''sock'' FROM customers;

Nota: Debe eliminar los VALUES de su INSERT y asegurarse de que los campos SELECT coincidan con los campos declarados INSERT .


Use el alias de la tabla en la subconsulta:

INSERT INTO customers ( customer_id, firstname, surname ) VALUES ((SELECT MAX( customer_id ) FROM customers C) +1, ''jim'', ''sock'')


Use el nombre de alias para la consulta interna como esta

INSERT INTO customers ( customer_id, firstname, surname ) VALUES ((SELECT MAX( customer_id )+1 FROM customers cust), ''sharath'', ''rock'')


SELECT MAX(col) +1 no es seguro: no garantiza que no esté insertando más de un cliente con el mismo valor de customer_id , independientemente de si selecciona de la misma tabla o de cualquier otra. La forma correcta de asegurar que se le asigne un valor entero único al insertarlo en su tabla en MySQL es usar AUTO_INCREMENT . El estándar ANSI es usar secuencias, pero MySQL no las admite. Una columna AUTO_INCREMENT solo se puede definir en la sentencia CREATE TABLE:

CREATE TABLE `customers` ( `customer_id` int(11) NOT NULL AUTO_INCREMENT, `firstname` varchar(45) DEFAULT NULL, `surname` varchar(45) DEFAULT NULL, PRIMARY KEY (`customer_id`) )

Dicho esto, esto funcionó bien para mí en 5.1.49:

CREATE TABLE `customers` ( `customer_id` int(11) NOT NULL DEFAULT ''0'', `firstname` varchar(45) DEFAULT NULL, `surname` varchar(45) DEFAULT NULL, PRIMARY KEY (`customer_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1$$ INSERT INTO customers VALUES (1, ''a'', ''b''); INSERT INTO customers SELECT MAX(customer_id) + 1, ''jim'', ''sock'' FROM CUSTOMERS;


insert into table1(id1) select (max(id1)+1) from table1;