2010-02-16 12 views
6

Mam jedną tabelę mysql "alfa", która będzie zawierać klucz podstawowy innej tabeli "beta" w jednej kolumnie. Ale jeśli nie można znaleźć wpisu w "beta", chcę wstawić wartość w "beta" i użyć nowego klucza w "alfa". Czy mogę to zrobić w jednym zapytaniu?wstawić, jeśli nie istnieje, po prostu wybierz w mysql

Obecnie mam:

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

który działa dobrze, gdy istnieje 'John' w tabeli, ale nie inaczej. Czy mogę go poprawić, aby nowa nazwa została wstawiona i wybrana, jeśli jeszcze jej tam nie ma? Identyfikator jest automatycznie zwiększany.

Próbowałem spojrzeć na IF, ale jeszcze nie dowiedziałem się, jak używać IF poza SELECT, jest to możliwe?

Wiem, że mogę to zrobić w kilku zapytaniach, ale rozmawiam ze zdalną bazą danych, więc byłoby miło zrobić to wszystko naraz.

Na przykład stoły mogły powstać tak:

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

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

tak alfa.c1 powinna odnosić się do wartości beta.id.

W skrócie chcę zrobić:

wstawić id John z tabeli beta w c1 w alfa, jeśli John nie istnieje w wersji beta, a następnie wstawić Jana w fazie beta i wstawić nowe auto zwiększane id dla john do c1 w alfa.

+0

Czy możesz edytować swoje pytanie, a przynajmniej umieścić struktury tabeli? Nie wiadomo, skĘ ... d otrzymasz dodatkowe informacje potrzebne w wersji beta? A jak to możliwe, że alfa może mieć dowolny klucz, jeśli nie jest jeszcze stworzony w wersji beta? –

+0

Próbowałem teraz dodać więcej informacji. – Zitrax

Odpowiedz

3

Zrobię sobie przerwę, ale pamiętaj, że pochodzi z tła Microsoft SQL i nie jestem obeznany z dokładną strukturą twoich tabel, więc niektóre z SQL są prawdopodobnie nieco ropey.

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 

Mam nadzieję, że to pomoże.

+1

p.s. Jeśli obawiasz się o liczbę zapytań, czemu nie skorzystać z procedury przechowywanej, w ten sposób nadal będziesz wykonywać tylko jedno połączenie z serwerem zdalnym. – Bryan

+0

Dzięki, wydaje się być blisko. Ale składnia to IF. ELSE .. END IF. Wygląda na to, że instrukcja IF może być użyta tylko w procedurze, więc muszę jej użyć w każdym przypadku. Ten sam problem omówiono tutaj: http://is.gd/8xupF – Zitrax

Powiązane problemy