Informix проверить, если таблица существует, а затем прочитать значение - PullRequest
1 голос
/ 16 июля 2009

У меня есть таблица в Informix (версия 11.50.UC4) с именем NextRecordID только с одним столбцом с именем id, и она будет иметь одну строку. Что я хочу сделать, это скопировать это значение в другую таблицу. Но не хочу, чтобы мой запрос не выполнялся, если эта таблица не существует. Что-то вроде

if table NextRecordID exists
    then insert into sometable values ('NextRecordID', (select id from NextRecordID))
    else insert into sometable values ('NextRecordID', 1)

Ответы [ 3 ]

1 голос
/ 20 июля 2009

В итоге я воспользовался приведенным ниже SQL-запросом. Это не ANSI SQL, но работает сервер informix, который я использую.

insert into sometable values ('NextRecordID', 
    select case (select 1 from systables where tabname='nextrecordid')
    when 1 then (select nextid from nextrecordid) 
    else (select 1 from systables where tabname='systables') end 
    from systables where tabname='systables');

То, что происходит здесь, находится внутри insert запроса. Я получаю значение, которое нужно вставить, используя select запрос. Теперь этот запрос select интересен. Он использует case оператор Informix. Я написал запрос select, чтобы проверить, существует ли таблица nextrecordid в systables, и вернем 1, если она существует. Если этот запрос возвращает 1, я запрашиваю значение в таблице nextrecordid, иначе я написал запрос, чтобы вернуть значение по умолчанию 1. Это работает для меня.

0 голосов
/ 17 июля 2009

Спасибо, что включили информацию о версии сервера - это облегчает ответ на ваш вопрос.

Вы не указали, какой язык (языки) вы используете.

Обычно, однако, вы разрабатываете программу, ожидающую определенную схему (определенные таблицы), и затем терпите неудачу - предпочтительно под контролем - если эти таблицы отсутствуют. Также неясно, попадете ли вы в проблемы из-за повторного выполнения второго оператора INSERT. Также неясно, когда таблица NextRecordID обновляется - возможно, после использования значения оно должно быть обновлено.

Вы должны взглянуть на SERIAL (BIGSERIAL) и посмотреть, подходит ли вам это.

Вам также следует посмотреть, подходит ли здесь ПОСЛЕДОВАТЕЛЬНОСТЬ для использования здесь - это, безусловно, выглядит так, как будто это применимо.

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

Кроме того, базы данных MODE ANSI усложняют жизнь - вам нужно беспокоиться о владельце таблицы (поскольку в базе данных MODE ANSI может быть несколько таблиц с именем nextrecordid). Скорее всего, вам не нужно беспокоиться об этом - так же, как вам не придется беспокоиться об идентификаторах с разделителями для таблицы "somebody". "NextRecordID" (которая отличается от таблицы somebody.NextRecordID).

0 голосов
/ 16 июля 2009

Это можно сделать, проверив таблицу systables.

...