Условная вставка в качестве одной транзакции базы данных в HSQLDB 1.8? - PullRequest
3 голосов
/ 03 марта 2010

Я использую конкретную таблицу базы данных, такую ​​как структура данных «Set», то есть вы можете попытаться вставить одну и ту же строку несколько раз, но она будет содержать только один экземпляр. Первичный ключ является естественным ключом. Например, я хочу, чтобы следующие серии операций работали нормально, и чтобы в Оклахоме была только одна строка:

insert into states_visited (state_name) values ('Oklahoma');
insert into states_visited (state_name) values ('Texas');     
insert into states_visited (state_name) values ('Oklahoma');

Я, конечно, получаю ошибку из-за дублирования первичного ключа при последующих вставках того же значения. Есть ли способ сделать вставку условной, чтобы эти ошибки не выкидывались? То есть только вставить, если естественный ключ еще не существует?

Я знаю, что мог бы сначала сделать предложение where и подзапрос для проверки существования строки, но, похоже, это будет дорого. Это две физические операции для одной логической операции «условной вставки». Что-нибудь подобное в SQL?

FYI. Я использую HSQLDB 1.8

.

Ответы [ 4 ]

2 голосов
/ 04 марта 2010

РЕДАКТИРОВАТЬ: только что заметил, ваш вопрос исключает этот ответ. В любом случае ядро ​​базы данных должно выполнить проверку where независимо от ограничения уникальности.

Оператор insert ... select допускает предложение where:

insert into states_visited (state_name) 
select 'Oklahoma'
where not exists
(
    select  * 
    from    states_visited
    where   state_name = 'Oklahoma'
)

Большинство баз данных SQL будут выполнять один оператор транзакционным способом.

0 голосов
/ 05 марта 2010

Я думаю, что я хочу использовать команду MERGE .

Однако для этого мне придется использовать HSQLDB 1.9 или более поздней версии .

0 голосов
/ 04 марта 2010

Нет способа сделать это на чистом SQL. Вам нужен процедурный язык для задачи. Например, в PL-SQL вы можете использовать анонимный блок PL-SQL.

0 голосов
/ 03 марта 2010

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

... имейте в виду, что этот код часто вызывается, возможно, он менее производительный, чем метод check-then-insert, который вы описали выше.

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

...