Сложный запрос INSERT - PullRequest
       12

Сложный запрос INSERT

0 голосов
/ 18 марта 2012

Я довольно новичок в MySQL. У меня есть две связанные таблицы, довольно распространенный случай: Клиенты (KID, имя, фамилия) и Посещения (VID, VKID, dateOfVisit) - VKID - это идентификатор Клиента. У меня проблема с подходящим INSERT-запросом, вот что я хочу сделать: 1.Проверьте, существует ли клиент с определенным именем и фамилией (предположим, что нет людей с такими же фамилиями) 2. Если да, получите идентификатор и сделайте таблицу INSERT to Visits 3. Если нет, ВСТАВЬТЕ нового Клиента, получите ID и ВСТАВЬТЕ в Посещения.

Можно ли сделать за один запрос?

Ответы [ 4 ]

1 голос
/ 18 марта 2012

Это должны быть два запроса в транзакции:

INSERT INTO Klients (name, surname)
VALUES ('John', 'Doe')
ON DUPLICATE KEY UPDATE
KID = LAST_INSERT_ID(KID);

INSERT INTO Visits (VKID, dateOfVisits)
VALUES (LAST_INSERT_ID(), NOW());

Первый оператор - это оператор upsert, где часть обновления использует малоизвестный, но предназначенный именно для функциональных целей LAST_INSERT_ID (), гдеявно переданное значение сохраняется для последующего получения значения.

UPD: я забыл упомянуть, что вам нужно будет добавить уникальное ограничение (фамилия, имя).

1 голос
/ 18 марта 2012

Оператор INSERT допускает только одну целевую таблицу.

Поэтому запрос, который вы ищете, просто невозможен, если вы не используете триггеры или хранимые процедуры.

Но такая проблема обычно решаетсяиспользуя следующий алгоритм:

1) вставить запись в таблицу [Посещения], предполагая, что родительская запись существует в таблице [Клиенты]

INSERT INTO Visits (VKID, dateOfVisit)
SELECT KID, NOW()
FROM Klients
WHERE (name=@name) AND (surname=@surname)

2) проверить количество вставленных записейпосле запроса (1)

3) если запись не была вставлена, добавьте новую таблицу записей [Клиенты], а затем снова запустите (1).

1 голос
/ 18 марта 2012

попробуйте что-то вроде этого

IF (SELECT * FROM `sometable` WHERE name = 'somename' AND surname = 'somesurname') IS NULL THEN
INSERT INTO Table1(name,surname) VALUES ('somename', 'somesurname');
ELSE INSERT INTO visits(kid,name,surname)
    SELECT kid, name, surname FROM Table1 WHERE name = 'somename' AND surname = 'somesurname';
END IF;

нет необходимости указывать 'VALUES' на второй вставке

я не проверял это, но это общее представление о том, что выпытаемся достичь.

1 голос
/ 18 марта 2012

Вам потребуется использовать IF EXIST / NOT EXISTS и использовать подзапрос для проверки таблицы. Смотрите ссылку bwlo

http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html

НТН

...