PostgreSQL 테이블 생성(존재하지 않는 경우)
MySQL 스크립트에서는 다음과 같이 쓸 수 있습니다.
CREATE TABLE IF NOT EXISTS foo ...;
...다른 것들...
그런 다음 테이블을 다시 만들지 않고 스크립트를 여러 번 실행할 수 있습니다.
PostgreSQL에서는 어떻게 해야 하나요?
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그리고.tablename에pg_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
'programing' 카테고리의 다른 글
| Git for Windows의 파일 이름이 너무 깁니다. (0) | 2023.04.22 |
|---|---|
| Azure SQL Database Web vs Business Edition (0) | 2023.04.22 |
| 탭으로 구분하여 내보낼 때 가장 적합한 MIME 유형 및 확장자는 무엇입니까? (0) | 2023.04.22 |
| 와틴인가 셀레늄인가? (0) | 2023.04.22 |
| Info.plist에 iOS 9 "fbauth2"가 없습니다. (0) | 2023.04.17 |