2013-05-14 4 views
0

У меня есть простая таблица, как этотВставка и выберите идентификатор уникального элемента в одном запросе

CREATE TABLE authid(
    id  INT NOT NULL AUTO_INCREMENT, 
    authid VARCHAR(128) NOT NULL UNIQUE, 
    PRIMARY KEY(id) 
); 

Теперь, если я ввожу значение с

INSERT INTO authid(authid) VALUES('test'); 

Это будет прекрасно работать и возвращать вставил id в первый раз, но если я сделаю это снова, когда authid уже существует (обратите внимание, что у нас есть authid, отмеченный как UNIQUE), он вернет ошибку.

Есть ли способ достичь этого в одном выражении SQL: Вставьте его, получите идентификатор, и если он уже существует, все равно получите идентификатор.

+0

Я немного смущен. Вы спрашиваете, как получить автоинкрементный идентификатор недавно вставленной записи? Или вы спрашиваете о чем-то с уникальным ограничением? –

+0

Я хочу вставить запись в таблицу, если запись уже существует, получить свой идентификатор, если нет, создать его и получить его id. –

+0

Эта проблема была избита здесь ... ЕСЛИ СУЩЕСТВУЕТСЯ в хранимой процедуре - лучший способ (как я помню). – Hogan

ответ

0

Ну, действительно, если вы попытаетесь вставить 2 раза то же значение в поле UNIQUE, это не сработает, это точка полей UNIQUE.

Если я хорошо понимаю, вы хотите знать, возможно ли использовать инструкцию INSERT или UPDATE в зависимости от наличия предмета или нет? Затем вам нужно 2 запросов, 1, чтобы проверить наличие, другой для вставки нового значения или обновление существующих один

+0

Два отдельных запроса? Это очень неудобно. –

+0

уникально, поэтому он имеет индекс. split second – Drew

1

Взгляните на это: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

Если вы используете MySQL 5.0 или выше, вы можете использовать " INSERT ... ON DUPLICATE KEY UPDATE ". Вы можете быть в состоянии объединить, что с LAST_INSERT_ID() (я не уверен, что о)

Итак:

insert into authid (authid) values ('test') on duplicate key update id=LAST_INSERT_ID(id), authid='test'; 
select LAST_INSERT_ID(); 
+0

, так что если тест существует, он ставит там тест, а затем выбирает в любом случае. heck почему бы не удалить строку и сделать вставку! – Drew

+0

Это самое близкое, спасибо. –

+0

предположим, что была такая функция/команда. это просто заставило бы вас подумать, что в любом случае это не будет делать выбор и вставка, а производительность исполнения будет одинаковой. поэтому переходите к более крупной рыбе, которую вы должны поджарить. Andrius – Drew

0

Вставьте значение условно (то есть, если он не существует). Вступает ли вставка или нет, к концу инструкции результат будет таким же: значение будет в таблице. Итак, просто выберите идентификатор строки, которая соответствует этому значению. Или, говоря в SQL, вот так:

INSERT INTO authid (authid) 
SELECT 'test' 
WHERE NOT EXISTS (
    SELECT * 
    FROM authid 
    WHERE authid = 'test' 
); 

SELECT id 
FROM authid 
WHERE authid = 'test' 
; 
Смежные вопросы