2010-02-16 17 views
6

Tengo una tabla mysql 'alfa' que contendrá la clave principal de otra tabla 'beta' en una columna. Pero si no se puede encontrar la entrada en 'beta', quiero insertar el valor en 'beta' y usar la nueva clave en 'alfa'. ¿Puedo hacer esto en una consulta de alguna manera?inserte si no existe más simplemente seleccione en mysql

Actualmente tengo:

INSERT INTO alfa SET c1=(SELECT id FROM beta WHERE name = 'john'); 

que funciona bien cuando existe 'John' en la tabla, pero no lo contrario. Entonces, ¿podría mejorarlo para permitir que el nuevo nombre se inserte y seleccione si aún no está allí? id está auto_incrementado.

He intentado mirar IF pero aún no he descubierto cómo usar IF fuera de SELECT, ¿es posible?

Sé que puedo hacerlo en varias consultas, pero estoy hablando con una base de datos remota, así que podría ser bueno hacerlo todo a la vez.

Por ejemplo, las tablas podrían haberse creado de esta manera:

CREATE TABLE alfa (
    c1 int, 
    PRIMARY KEY (c1) 
) 

CREATE TABLE beta (
    id int auto_increment, 
    name varchar(255), 
    PRIMARY KEY (id) 
) 

por lo alfa.c1 debe hacer referencia a los valores beta.id.

En pocas palabras, quieren hacer:

introduzca el ID de John de la tabla beta en C1 en alfa, si John no existe en beta a continuación, insertar John en beta e insertar el nuevo auto incrementa Identificación de John en c1 en alfa.

+0

¿Puede posiblemente editar su pregunta, y al menos poner las estructuras de la tabla? No está claro de dónde vas a tener la información adicional que necesitas en beta? ¿Y cómo posiblemente alfa puede tener alguna clave, si todavía no está creada en beta? –

+0

He intentado agregar más información ahora. – Zitrax

Respuesta

3

Voy a intentarlo, pero tenga en cuenta que, viniendo de un fondo de Microsoft SQL, y no estoy familiarizado con la estructura exacta de sus tablas, entonces algunas de las SQL probablemente sean un poco sobrias.

IF (SELECT COUNT(*) FROM beta WHERE name = 'John' > 0) 
    UPDATE alfa SET c1=(SELECT id FROM beta WHERE name = 'John') 
ELSE 
BEGIN 
    INSERT INTO beta (name) VALUES ('John') 
    INSERT INTO alfa (c1) VALUES (LAST_INSERT_ID()) 
END 

Espero que esto sea de alguna ayuda.

+1

p.s. Si le preocupa el número de consultas, ¿por qué no utiliza un procedimiento almacenado? De esa forma, solo realiza una única llamada al servidor remoto. – Bryan

+0

Gracias, esto parece estar cerca. Pero la sintaxis es IF .. ELSE .. END IF. Y parece que la declaración IF solo se puede usar en un procedimiento, así que tengo que usar eso en cualquier caso. El mismo problema se discute aquí: http://is.gd/8xupF – Zitrax

Cuestiones relacionadas