Есть ли способ сделать INSERT INTO с auto_increment, если он не существует?

У меня есть таблица, которая выглядит так:

| ID | int PRIMARY  
| Name | varchar  
| timestamp | timestamp

Как мне это сделать зная ID?

Чтобы лучше показать вам, что я хочу, вот пример с использованием двух запросов, которые помогут вам лучше понять:

Во-первых, я просто делаю запрос SELECT, чтобы узнать, существует ли идентификатор.
Если он не существует (наиболее распространенный случай), я создаю новую строку, игнорируя идентификатор, который мне был предоставлен в качестве входных данных, и я использую MySQL AUTO_INCREMENT для идентификатора.

Есть ли способ архивировать это?

Примечание. Из-за того, как здесь работают внешние ключи. использование REPLACE вместо INSERT INTO не является ответом.

Примечание 2: Поскольку я хочу принудительно использовать AUTO_INCREMENT, если он не существует, на первый взгляд INSERT IGNORE INTO также не кажется ответом. Если я что-то не упустил... Вот поэтому я и спрашиваю.


person brunoais    schedule 28.03.2013    source источник
comment
Итак, если идентификатор 5 не существует, вы хотите вместо этого использовать INSERT с автоматически увеличивающимся идентификатором? Это не имеет никакого смысла. Почему вы это делаете?   -  person tadman    schedule 28.03.2013
comment
@tadman Потому что идентификатор получен от пользователя. Я не хочу, чтобы пользователь определял идентификатор при его создании! Я тот, кто решает! Есть идея ;)?   -  person brunoais    schedule 28.03.2013
comment
Похоже, вы создаете ORM. Обычно это плохо заканчивается. Почему бы вам не использовать уже существующий?   -  person tadman    schedule 29.03.2013
comment
@tadman Надеюсь, это не ORM. По крайней мере, это не намерение.   -  person brunoais    schedule 29.03.2013
comment
Прямые манипуляции с базой данных, вероятно, плохая идея. Вы уверены, что хотите пойти по этой дороге?   -  person tadman    schedule 29.03.2013
comment
@tadman Да. Я не люблю использовать фреймворки и тому подобное. Элементы управления базой данных, на мой вкус, слишком высоки, но все же удобны для меня. С фреймворками тогда становится слишком неудобно. Это то, что я не могу объяснить.   -  person brunoais    schedule 29.03.2013
comment
Я думаю, вам нужно будет использовать другую таблицу в качестве счетчика auto_increment, чтобы добиться этого.   -  person Vatev    schedule 29.03.2013
comment
хм... я понял. Хорошо, спасибо за помощь. Я буду использовать стратегию дополнительного стола   -  person brunoais    schedule 29.03.2013
comment
Если вам не нравятся фреймворки, вы используете неправильные фреймворки. С правильным фреймворком вы будете как минимум на порядок продуктивнее, чем без него. Выбивать запросы вручную сложно, и это должно быть исключением из того, что вы делаете, а не правилом. Например, то, что вы здесь делаете, похоже на три строки кода в REST-приложении.   -  person tadman    schedule 29.03.2013


Ответы (1)


Похоже, вы хотите обновить дубликат ключа.

INSERT INTO yourTable (
    id,
    name,
    timestamp
) VALUES (
    5,
    'something',
    NOW()
)
ON DUPLICATE KEY UPDATE
    name = VALUES(name),
    timestamp = VALUES(timestamp);

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

INSERT () VALUES () идет прямо вперед. ON DUPLICATE KEY UPDATE сообщает, что если ключ UNIQUE/PRIMARY конфликтует, то вместо этого следует обновить некоторые значения в этой строке. Синтаксис fields = VALUES(fields) указывает ему обновить эти поля в конфликтующей строке значениями, указанными в INSERT.

Второй подход заключается в использовании хранимой процедуры для обработки INSERT в вашей таблице, которая выполняет предварительное условие SELECT, поскольку вы не можете одновременно использовать SELECT и INSERT для таблицы в одном запросе.

person Simon at My School Portal    schedule 28.03.2013
comment
Какой из этих битов вставляется с автоматически увеличивающимся id? - person eggyal; 28.03.2013
comment
Он просто вставит с указанным идентификатором. Чтобы вставить его с помощью AI, вам нужно изменить значение столбца id на NULL, если оно не существует. Я поиграю на скрипте SQL и посмотрю, смогу ли я что-нибудь придумать. - person Simon at My School Portal; 28.03.2013
comment
Он просто вставит с указанным идентификатором. Чтобы вставить его с помощью AI, вам нужно изменить значение столбца id на NULL, прочитайте вопрос. Вы отвечаете на вопрос, который я не задавал. Вы отвечаете на мой вопрос без условия, которое я написал о необходимости использовать A_I при вставке - person brunoais; 28.03.2013