2012-01-06 2 views
0

У меня есть таблица, которая всегда имеет 0 или 1 ряд. Я хочу написать скрипт, который будет вставлять строку, если она пуста, и ничего не делать, если есть строка. Я попытался это:SQL: Как я могу вставить строку, если таблица пуста, иначе ничего не делать?

SELECT * CASE WHEN (SELECT COUNT(*) FROM table < 0) 
    THEN (INSERT INTO table (a, b, c, d) VALUES ('a', 'b', 'c', 'd')) 
    END CASE 
FROM table; 

Но я получаю:

FROM ключевое слово не найдено, где ожидалось.

Это похоже на то, что должно быть довольно просто, что я делаю неправильно?

+0

** NOTE ** Если у вас нет других ограничений, установленных до. Два отдельных сеанса могут запрашивать вашу таблицу, находить ее пустой и вставлять строку, каждая из которых приводит к двум строкам. Чтобы это не происходило, настройте первичный ключ в своей таблице и назначьте контрольное ограничение для этого ПК так, чтобы оно могло иметь только одно значение: 'create table t (ограничение количества PK t_pk ограничение первичного ключа T_CK1 check (PK = 1) ...) ' –

ответ

12

Вы можете перестроить запрос в отборную/вставку и использовать not exists ключевые слова, чтобы проверить, если таблица пуста, например, так:

insert table (a, b, c, d) 
select 'a', 'b', 'c', 'd' 
from dual 
where not exists (select 1 from table) 

или, если это необходимо в if заявлении, аналогично:

if not exists (select 1 from table) 
    insert table (a, b, c, d) values ('a', 'b', 'c', 'd') 
+0

Это не сработало для меня: INSERT INTO mytable (a, b, c, c) SELECT 'a' b, 'c', 'd' FROM mytable ГДЕ НЕ СУЩЕСТВУЕТ (ВЫБРАТЬ 1 FROM mytable); Он никогда не вставляет строку, даже если таблица имеет 0 строк. – user1134858

+0

@ user1134858: Используйте 'dual', поэтому вы получите строку, когда myTable пуст. См. Редактирование, которое я сделал для этого ответа. –

+0

Этот ответ, похоже, использует синтаксис SQL Server, а не Oracle. В первом запросе необходимо выражение 'from'. В отличие от SQL Server, Oracle не поддерживает 'select' без' from'. Оператор 'if' недействителен PL \ SQL. Отсутствуют ключевые слова 'then' и' end if'. И PL/SQL не поддерживает 'not exist' часть сравнения и оператор' if'. В PL \ SQL необходимо будет создать и заполнить переменную для хранения count, тогда 'if' проверяет, что против' <> 0'. –

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