postgres에서 단일 명령을 사용하여 (데이터베이스를 손상시키지 않고) 모든 테이블에서 모든 행을 삭제하거나 postgres에서 삭제를 계단식으로 나열 할 수 있습니까?Postgres : 모든 테이블을 삭제하거나 삭제를 계단식으로합니까?
그렇다면 테스트 데이터베이스를 어떻게 재설정 할 수 있습니까?
postgres에서 단일 명령을 사용하여 (데이터베이스를 손상시키지 않고) 모든 테이블에서 모든 행을 삭제하거나 postgres에서 삭제를 계단식으로 나열 할 수 있습니까?Postgres : 모든 테이블을 삭제하거나 삭제를 계단식으로합니까?
그렇다면 테스트 데이터베이스를 어떻게 재설정 할 수 있습니까?
이 포스트 그레스
자네 말이 맞아에서 하나의 명령으로 모든 테이블의 모든 행을 삭제하거나 수는, 대답은 당신이 삭제됩니다 외래 키 계단식 정의 할 수 있습니다 NO
없다 "부모"가 삭제되면 모든 참조 행. 그러나 외래 키의 특성이므로 DELETE 문으로 지정할 수있는 것은 없습니다.
- 와우.
무엇을 의미할까요?
두 번째 생각 : 달성하려는 목표는 무엇입니까?
나는 당신이 "재설정"하려고하는 의혹이 있습니다. 테스트 데이터베이스 이 경우 PostgreSQL의 접근 방식은 다음과 같습니다
CREATE DATABASE testdb TEMPLATE my_template
새로 생성 된 TESTDB를 사용하여 테스트 데이터베이스를 다시 만듭니다 다음 DROP DATABASE testdb
을하고. 아마도 로트 모든 행을 삭제하는 것보다 빠릅니다.
모든 스키마의 모든 테이블을 선택하고이 테이블에서 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();
+1 : [TRUNCATE] (http://www.postgresql.org/docs/8.1/interactive/sql-truncate.html)가 나의 선택 일 것입니다 - DELETE CASCADE의 팬이 아니라 너무 쉽게 망칠 수 있습니다. fat fingering ... –
이 솔루션은 데이터베이스에 정의 된 외래 키가없는 경우에만 작동하며 아주 단순한 데이터베이스에서만 유효합니다. 그러나 먼저 기존의 모든 제약 조건을 삭제 한 다음 모든 테이블을 잘라내도록 기능을 향상시킬 수 있습니다. –
아니, 그건 CASCADE가 들어오는 곳입니다. 그냥 테스트 해 보면 알 수 있습니다. http://www.postgresql.org/docs/current/static/sql-truncate.html –
네가 맞아, 그게 내가하려는 일이고, 포스트그레스는 데이터를 빨리 지울 수있는 간단한 방법이 없다는 사실에 좌절감을 느끼고 있었다. 나는 템플릿을 만들 것이다. 도움을 주셔서 감사합니다. – AP257
"DELETE all FROM everything"형식의 문장을 기대하는 것처럼 보입니다. 왜 그런지 궁금합니다. 내가 아는 데이터베이스는 이것을 지원하지 않는다. –
글쎄, 내가 정말로 원하는 건 캐스케이드 삭제이다. 그것이 없다면 모든 것을 모두 삭제하면 받아 들일 수있는 대체물이 될 것입니다. 그러나 어느 쪽도 가지지 않고있는 것은 약간의 고통이다! – AP257