В сценарии MySQL вы можете написать:
CREATE TABLE IF NOT EXISTS foo ...;
... другие вещи ...
и затем вы можете запустить скрипт много раз, не создавая заново таблицу.
Как вы делаете это в PostgreSQL?
источник
В сценарии MySQL вы можете написать:
CREATE TABLE IF NOT EXISTS foo ...;
... другие вещи ...
и затем вы можете запустить скрипт много раз, не создавая заново таблицу.
Как вы делаете это в PostgreSQL?
Эта функция была реализована в Postgres 9.1 :
CREATE TABLE IF NOT EXISTS myschema.mytable (i integer);
Для более старых версий здесь есть функция, чтобы обойти это:
CREATE OR REPLACE FUNCTION create_mytable ()
RETURNS void AS
$func$
BEGIN
IF EXISTS (SELECT FROM pg_catalog.pg_tables
WHERE schemaname = 'myschema'
AND tablename = 'mytable') THEN
RAISE NOTICE 'Table myschema.mytable already exists.';
ELSE
CREATE TABLE myschema.mytable (i integer);
END IF;
END
$func$ LANGUAGE plpgsql;
Вызов:
SELECT create_mytable(); -- call as many times as you want.
Ноты:
Столбцы schemaname
и tablename
в pg_tables
чувствительны к регистру. Если вы используете двойные кавычки идентификаторов в CREATE TABLE
выражении, вам нужно использовать точно такое же написание. Если вы этого не сделаете, вам нужно использовать строчные буквы. Видеть:
pg_tables
содержит только актуальные таблицы . Идентификатор все еще может быть занят связанными объектами. Видеть:
Если роль, выполняющая эту функцию, не обладает необходимыми привилегиями для создания таблицы, которую вы можете использовать SECURITY DEFINER
для этой функции, и сделайте ее владельцем другой роли с необходимыми привилегиями. Эта версия достаточно безопасна.
CREATE FUNCTION
только один раз. Это то,SELECT create_mytable();
что вы можете позвонить много раз.Попробуй это:
источник
IF NOT EXISTS
опцию.Я создал общее решение из существующих ответов, которые можно использовать для любой таблицы:
Использование:
В дальнейшем можно было бы упростить использование только одного параметра, если вы извлечете имя таблицы из параметра запроса. Также я не учел схемы.
источник
Это решение несколько похоже на ответ Эрвина Брандштеттера, но использует только язык sql.
Не во всех установках PostgreSQL по умолчанию используется язык plpqsql, это означает, что вам, возможно, придется вызвать
CREATE LANGUAGE plpgsql
перед созданием функции, а затем снова удалить язык, чтобы оставить базу данных в том же состоянии, в каком она была раньше (но только если база данных не было языка plpgsql для начала). Видите, как растет сложность?Добавление plpgsql может не вызывать проблем, если вы выполняете свой сценарий локально, однако, если сценарий используется для настройки схемы у клиента, может быть нежелательно оставлять подобные изменения в базе данных клиентов.
Это решение вдохновлено постом Андреаса Шербаума .
источник
CREATE TABLE, ЕСЛИ НЕ СУЩЕСТВУЕТ ... нет, но вы можете написать для этого простую процедуру, например:
источник
CREATE TABLE, ЕСЛИ НЕ СУЩЕСТВУЕТ ... нет, но вы можете написать для этого простую процедуру, например:
источник