[SQL] 하지가 존재하는 경우 테이블을 만들 PostgreSQL을
SQL하지가 존재하는 경우 테이블을 만들 PostgreSQL을
MySQL의 스크립트에서 당신은 쓸 수 있습니다 :
CREATE TABLE IF NOT EXISTS foo ...;
... 다른 것들 ...
다음은 테이블을 재 작성하지 않고, 스크립트를 여러 번 실행할 수 있습니다.
당신은 어떻게 PostgreSQL의에서이 작업을 수행합니까?
해결법
-
==============================
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.이 시도:
이 시도:
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.나는 모든 테이블에 재사용 할 수있는 기존의 답변 중 일반적인 솔루션을 개발 :
나는 모든 테이블에 재사용 할 수있는 기존의 답변 중 일반적인 솔루션을 개발 :
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.이 솔루션은 어윈 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.이 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.이 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' );
from https://stackoverflow.com/questions/1766046/postgresql-create-table-if-not-exists by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] VARCHAR와 DATE / DATETIME을 사용하는 경우 (0) | 2020.04.30 |
---|---|
[SQL] SQL 서버 문자열로 VARBINARY로 변환 (0) | 2020.04.30 |
[SQL] 데이터베이스 트랜잭션이 경쟁 조건을 방지합니까? (0) | 2020.04.30 |
[SQL] 3 백만 행 PostgreSQL 데이터베이스에 느린 간단한 업데이트 쿼리 (0) | 2020.04.30 |
[SQL] 모든 테이블 명령을 드롭 (0) | 2020.04.30 |