2014-10-12 2 views
0

Я вставив some_data (уникальный ключ столбца), а затем, используя полученный user_id (ключевой столбец первичного автоинкрементируемого) в отдельном заявлении (не показан)Mysql: самый эффективный способ получить идентификатор от попытки вставки?

INSERT IGNORE INTO users (some_data) VALUES ('test'); 
SELECT LAST_INSERT_ID(); <--- I do stuff with this. 

Но, конечно, если some_data уже существует (бывает очень часто), LAST_INSERT_ID() возвращает 0. Каков наилучший способ получить user_id на основе уникального ключа some_data, в данном случае? Конечно, я могу сделать отдельный запрос WHERE, но не уверен, что это самый эффективный.

ответ

1

От http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

INSERT INTO users (id, some_col) VALUES (n,some_val) 
    ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), some_col=some_val; 

Не игнорирования, но может сделать работу?


Edit:

Чтобы было ясно, это обновление some_col с some_val, а затем установить LAST_INSERT_ID вернуть идентификатор дубликата строки.

Это может точно так же быть, если вы не хотите обновлять какие-либо данные о дубликате, а просто установить LAST_INSERT_ID() вызов, чтобы дать вам то, что вы хотите:

INSERT INTO users (user_name) VALUES ('bobloblaw') 
    ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id); 

Edit 2:

Используйте процедурный, чтобы сделать работу и получить обратно идентификатор

DELIMITER $$ 
CREATE PROCEDURE insert_test(val1 varchar(10), val2 varchar(10)) 
BEGIN 

    INSERT INTO test.test_table (col1, col2) SELECT val1, val2 FROM (select 1) as a 
    WHERE NOT EXISTS (
      select 1 from test.test_table t where t.col1 = val1 
    ); 

    SELECT id FROM test.test_table where col1 = val1; 

END $$ 
DELIMITER ; 
+0

Er .... (1) Я не знаю, идентификатор. (2) не будет ли устанавливать id равным 0, если ключ дублируется? – Agamemnus

+1

Отметьте это сообщение: http: //stackoverflow.com/questions/14383503/on-duplicate-key-update-same-as-insert Кажется, это тоже ваша проблема. – byrnedo

+0

byrnedo, спасибо за ссылку, но критическая часть получает идентификатор после вставки/обновления уже существующего элемента. Никакого решения не было. – Agamemnus

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