복붙노트

[SQL] 하지가 존재하는 경우 테이블을 만들 PostgreSQL을

SQL

하지가 존재하는 경우 테이블을 만들 PostgreSQL을

MySQL의 스크립트에서 당신은 쓸 수 있습니다 :

CREATE TABLE IF NOT EXISTS foo ...;

... 다른 것들 ...

다음은 테이블을 재 작성하지 않고, 스크립트를 여러 번 실행할 수 있습니다.

당신은 어떻게 PostgreSQL의에서이 작업을 수행합니까?

해결법

  1. ==============================

    1.이 기능은 포스트 그레스 9.1에서 구현되었습니다 :

    이 기능은 포스트 그레스 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. 
    

    노트:

  2. ==============================

    2.이 시도:

    이 시도:

    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)
    )
    
  3. ==============================

    3.나는 모든 테이블에 재사용 할 수있는 기존의 답변 중 일반적인 솔루션을 개발 :

    나는 모든 테이블에 재사용 할 수있는 기존의 답변 중 일반적인 솔루션을 개발 :

    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);');
    

    하나가 쿼리 매개 변수에서 테이블 이름을 추출 할 경우 하나의 매개 변수를 사용하는 더 단순화 할 수있다. 또한 나는 스키마를 떠났다.

  4. ==============================

    4.이 솔루션은 어윈 Brandstetter에 의해 대답에 다소 비슷하지만, 단지 SQL 언어를 사용합니다.

    이 솔루션은 어윈 Brandstetter에 의해 대답에 다소 비슷하지만, 단지 SQL 언어를 사용합니다.

    모든 PostgreSQL의 설치는 기본적으로 plpqsql 언어를 가지고,이 방법 당신은 (하지만 기능을 작성하기 전에 언어의 plpgsql을 CREATE 호출하고 그 후에는 예전과 같은 상태로 데이터베이스를 떠나, 다시 언어를 제거해야 할 수 있습니다 데이터베이스)로 시작하는 plpgsql 언어를 가지고 있지 않은 경우. 복잡성이 성장하는 방법을 참조하십시오?

    스크립트은 (는) 고객 데이터베이스에서이 같은 변화를두고하는 것이 바람직하지 않을 수 있습니다 고객에 스키마를 설정하는 데 사용되는 경우, 그러나, 로컬 스크립트를 실행하는 경우 plpgsql을 추가하는 것은 문제가되지 않을 수 있습니다.

    이 솔루션은 안드레아스 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();
    
  5. ==============================

    5.이 NOT이있는 경우 어떤 표를 만드는 것입니다 ...하지만 당신이에 대한 간단한 절차를 쓸 수 있습니다, 같은 :

    이 NOT이있는 경우 어떤 표를 만드는 것입니다 ...하지만 당신이에 대한 간단한 절차를 쓸 수 있습니다, 같은 :

    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;
    
  6. ==============================

    6.이 NOT이있는 경우 어떤 표를 만드는 것입니다 ...하지만 당신이에 대한 간단한 절차를 쓸 수 있습니다, 같은 :

    이 NOT이있는 경우 어떤 표를 만드는 것입니다 ...하지만 당신이에 대한 간단한 절차를 쓸 수 있습니다, 같은 :

    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'
      );
    
  7. from https://stackoverflow.com/questions/1766046/postgresql-create-table-if-not-exists by cc-by-sa and MIT license