programing

PostgreSQL 테이블 생성(존재하지 않는 경우)

iphone6s 2023. 4. 22. 09:06
반응형

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
  LANGUAGE plpgsql 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$;

문의:

SELECT create_mytable();        -- call as many times as you want. 

메모들

schemaname그리고.tablenamepg_tables대소문자를 구분합니다.에서 식별자를 큰따옴표로 묶으면CREATE TABLE스테이트먼트에서는, 같은 철자를 사용할 필요가 있습니다.그렇지 않으면 소문자 문자열을 사용해야 합니다.참조:

pg_tables에는 실제 테이블만 포함되어 있습니다.식별자는 여전히 관련 객체가 점유하고 있을 수 있습니다.참조:

이 기능을 실행하는 역할에 해당 기능에 사용할 테이블을 만들고 필요한 권한을 가진 다른 역할에 의해 소유되도록 하기 위한 필요한 권한이 없는 경우.이 버전은 충분히 안전합니다.

이것을 시험해 보세요.

CREATE TABLE IF NOT EXISTS app_user (
  username varchar(45) NOT NULL,
  password varchar(450) NOT NULL,
  enabled integer NOT NULL DEFAULT '1',
  PRIMARY KEY (username)
)

모든 테이블에 재사용할 수 있는 기존 답변에서 범용 솔루션을 만들었습니다.

CREATE OR REPLACE FUNCTION create_if_not_exists (table_name text, create_stmt text)
RETURNS text AS
$_$
BEGIN

IF EXISTS (
    SELECT *
    FROM   pg_catalog.pg_tables 
    WHERE    tablename  = table_name
    ) THEN
   RETURN 'TABLE ' || '''' || table_name || '''' || ' ALREADY EXISTS';
ELSE
   EXECUTE create_stmt;
   RETURN 'CREATED';
END IF;

END;
$_$ LANGUAGE plpgsql;

사용방법:

select create_if_not_exists('my_table', 'CREATE TABLE my_table (id integer NOT NULL);');

쿼리 파라미터에서 테이블 이름을 추출할 경우 하나의 파라미터만 취득하는 것이 더욱 단순해질 수 있습니다.그리고 스키마도 빼먹었어요.

이 솔루션은 Erwin Brandstetter의 답변과 다소 유사하지만 SQL 언어만 사용합니다.

모든 포스트그레는 아니다SQL 설치에는 기본적으로 plpqsql 언어가 포함되어 있습니다.즉, 콜이 필요할 수 있습니다.CREATE LANGUAGE plpgsql함수를 작성하기 전에 다시 언어를 삭제해야 합니다.데이터베이스를 이전과 같은 상태로 유지하려면(단, 데이터베이스에 plpgsql 언어가 없는 경우에만).복잡성이 증가하는 것을 알 수 있습니까?

스크립트를 로컬로 실행하고 있는 경우에는 plpgsql을 추가하는 것이 문제가 되지 않을 수 있습니다.다만, 스크립트를 사용해 고객의 스키마를 셋업 하는 경우는, 이러한 변경을 고객의 데이타베이스에 남기는 것이 바람직하지 않을 수 있습니다.

이 솔루션은 Andreas Scherbaum의 게시물에서 영감을 얻었습니다.

-- Function which creates table
CREATE OR REPLACE FUNCTION create_table () RETURNS TEXT AS $$
    CREATE TABLE table_name (
       i int
    );
    SELECT 'extended_recycle_bin created'::TEXT;
    $$
LANGUAGE 'sql';

-- Test if table exists, and if not create it
SELECT CASE WHEN (SELECT true::BOOLEAN
    FROM   pg_catalog.pg_tables 
    WHERE  schemaname = 'public'
    AND    tablename  = 'table_name'
  ) THEN (SELECT 'success'::TEXT)
  ELSE (SELECT create_table())
END;

-- Drop function
DROP FUNCTION create_table();

존재하지 않는 경우 CREATE TABLE은 없지만 다음과 같은 간단한 절차를 작성할 수 있습니다.

CREATE OR REPLACE FUNCTION execute(TEXT) RETURNS VOID AS $$
BEGIN
  EXECUTE $1;
END; $$ LANGUAGE plpgsql;


SELECT 
  execute($$
      CREATE TABLE sch.foo 
      (
        i integer
      )
  $$) 
WHERE 
  NOT exists 
  (
    SELECT * 
    FROM information_schema.tables 
    WHERE table_name = 'foo'
      AND table_schema = 'sch'
  );

존재하지 않는 경우 CREATE TABLE은 없지만 다음과 같은 간단한 절차를 작성할 수 있습니다.

CREATE OR REPLACE FUNCTION prc_create_sch_foo_table() RETURNS VOID AS $$
BEGIN

EXECUTE 'CREATE TABLE /* IF NOT EXISTS add for PostgreSQL 9.1+ */ sch.foo (
                    id serial NOT NULL, 
                    demo_column varchar NOT NULL, 
                    demo_column2 varchar NOT NULL,
                    CONSTRAINT pk_sch_foo PRIMARY KEY (id));
                   CREATE INDEX /* IF NOT EXISTS add for PostgreSQL 9.5+ */ idx_sch_foo_demo_column ON sch.foo(demo_column);
                   CREATE INDEX /* IF NOT EXISTS add for PostgreSQL 9.5+ */ idx_sch_foo_demo_column2 ON sch.foo(demo_column2);'
               WHERE NOT EXISTS(SELECT * FROM information_schema.tables 
                        WHERE table_schema = 'sch' 
                            AND table_name = 'foo');

         EXCEPTION WHEN null_value_not_allowed THEN
           WHEN duplicate_table THEN
           WHEN others THEN RAISE EXCEPTION '% %', SQLSTATE, SQLERRM;

END; $$ LANGUAGE plpgsql;

언급URL : https://stackoverflow.com/questions/1766046/postgresql-create-table-if-not-exists

반응형