2010-08-19 4 views

답변

7

이 포스트 그레스

자네 말이 맞아에서 하나의 명령으로 모든 테이블의 모든 행을 삭제하거나 수는, 대답은 당신이 삭제됩니다 외래 키 계단식 정의 할 수 있습니다 NO

없다 "부모"가 삭제되면 모든 참조 행. 그러나 외래 키의 특성이므로 DELETE 문으로 지정할 수있는 것은 없습니다.

- 와우.

무엇을 의미할까요?

두 번째 생각 : 달성하려는 목표는 무엇입니까?

나는 당신이 "재설정"하려고하는 의혹이 있습니다. 테스트 데이터베이스 이 경우 PostgreSQL의 접근 방식은 다음과 같습니다

  • 이 (등 테이블, 뷰, 인덱스) 모두를 포함하는 데이터베이스 당신이 (예를 들어 my_template 호출) 새 데이터베이스에 필요한
  • 현재 테스트 -를 다시 만들기 DB는 my_template에 정의 된 모든 테이블이됩니다 CREATE DATABASE testdb TEMPLATE my_template

새로 생성 된 TESTDB를 사용하여 테스트 데이터베이스를 다시 만듭니다 다음 DROP DATABASE testdb을하고. 아마도 로트 모든 행을 삭제하는 것보다 빠릅니다.

+1

네가 맞아, 그게 내가하려는 일이고, 포스트그레스는 데이터를 빨리 지울 수있는 간단한 방법이 없다는 사실에 좌절감을 느끼고 있었다. 나는 템플릿을 만들 것이다. 도움을 주셔서 감사합니다. – AP257

+0

"DELETE all FROM everything"형식의 문장을 기대하는 것처럼 보입니다. 왜 그런지 궁금합니다. 내가 아는 데이터베이스는 이것을 지원하지 않는다. –

+0

글쎄, 내가 정말로 원하는 건 캐스케이드 삭제이다. 그것이 없다면 모든 것을 모두 삭제하면 받아 들일 수있는 대체물이 될 것입니다. 그러나 어느 쪽도 가지지 않고있는 것은 약간의 고통이다! – AP257

5

모든 스키마의 모든 테이블을 선택하고이 테이블에서 CASCADE 또는 TRUNCATE를 수행하는 저장 프로 시저를 작성할 수 있습니다. 이것은 pl/pgsql-code의 몇 줄에 지나지 않습니다.

편집 : 트릭을 수행하지만주의해야합니다! :

CREATE OR REPLACE FUNCTION truncate_all() RETURNS void LANGUAGE plpgsql AS 
$$ 
DECLARE 
    row record; 
    query text; 
BEGIN 
    query := 'SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema NOT IN(''pg_catalog'', ''information_schema'') AND table_type = ''BASE TABLE'''; 

    FOR row IN EXECUTE query LOOP 
     EXECUTE 'TRUNCATE ' || quote_ident(row.table_schema) || '.' || quote_ident(row.table_name) || ' CASCADE;'; 
    END LOOP; 

    RETURN; 
END; 
$$; 

-- execute: 
SELECT truncate_all(); 
+3

+1 : [TRUNCATE] (http://www.postgresql.org/docs/8.1/interactive/sql-truncate.html)가 나의 선택 일 것입니다 - DELETE CASCADE의 팬이 아니라 너무 쉽게 망칠 수 있습니다. fat fingering ... –

+0

이 솔루션은 데이터베이스에 정의 된 외래 키가없는 경우에만 작동하며 아주 단순한 데이터베이스에서만 유효합니다. 그러나 먼저 기존의 모든 제약 조건을 삭제 한 다음 모든 테이블을 잘라내도록 기능을 향상시킬 수 있습니다. –

+0

아니, 그건 CASCADE가 들어오는 곳입니다. 그냥 테스트 해 보면 알 수 있습니다. http://www.postgresql.org/docs/current/static/sql-truncate.html –

관련 문제