2010-02-16 3 views
6

У меня есть одна таблица mysql 'alfa', которая будет содержать первичный ключ другой таблицы 'beta' в одном столбце. Но если запись в 'beta' не может быть найдена, я хочу вставить значение в 'beta' и использовать новый ключ в 'alfa'. Могу ли я сделать это в одном запросе?Вставить, если не существует else, просто выберите в mysql

я в настоящее время:

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

, который хорошо работает, когда существует «джон» в таблице, но не может иначе. Могу ли я улучшить его, чтобы новое имя было вставлено и выбрано, если оно еще не существует? id is auto_incremented.

Я попытался посмотреть IF, но еще не понял, как использовать IF вне SELECT, возможно ли это?

Я знаю, что могу сделать это в нескольких запросах, но я говорю с удаленной базой данных, поэтому было бы неплохо сделать все это сразу.

Например таблицы могли быть созданы следующим образом:

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

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

так alfa.c1 должны относиться к значениям beta.id.

Короче я хочу сделать:

вставить идентификатор для сортира из беты-таблицы в c1 в альфа, если Джон не существует в бета-версии затем вставить Джон в бета-версию и вставить новое авто увеличивается идентификатор для john в c1 в alfa.

+0

Возможно, вы можете отредактировать свой вопрос и, по крайней мере, разместить структуры таблиц? Неясно, откуда у вас будет дополнительная информация, которая вам нужна в бета-версии? И как, возможно, у alfa есть ключ, если он еще не создан в бета-версии? –

+0

Я попытался добавить дополнительную информацию сейчас. – Zitrax

ответ

3

Я поеду, но имейте в виду, что исходя из фона Microsoft SQL, и я не знаком с точной структурой ваших таблиц, поэтому некоторые из SQL, вероятно, являются немного канатными.

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 

Надеюсь, это поможет.

+1

p.s. Если вас беспокоит количество запросов, почему бы не использовать хранимую процедуру, таким образом вы по-прежнему выполняете только один вызов на удаленном сервере. – Bryan

+0

Спасибо, кажется, близко. Но синтаксис IF .. ELSE .. END IF. И похоже, что оператор IF может использоваться только в процедуре, поэтому я должен использовать это в любом случае. Тот же вопрос обсуждается здесь: http://is.gd/8xupF – Zitrax

Смежные вопросы