2013-03-29 5 views
2

У меня есть таблица в моем db, называемая «mytable». Я хотел бы очистить его, чтобы я мог продолжать собирать и анализировать «свежие данные».psql - как очистить содержимое базы данных, не отбрасывая таблицу

Что-то вроде

conn = psycopg2.connect(database = mydb_name, host = mydb_server, user = mydb_uname, password = mydb_pwd) 
cur = conn.cursor() 
cur.execute("DROP TABLE mytable;") 

Не будет работать для меня, потому что, насколько я понимаю, это разрушает таблицу. Я не хочу уничтожать/воссоздавать ... Просто чтобы очистить все данные.

Как я могу это решить?

ответ

5
Truncate tablename 

Полезно для этого, таблица остается только сбросив данные!

Если у вас есть внешние ключи, необходимо использовать следующую

Truncate tablename CASCADE 

Для многих таблиц нравится этот

Truncate table1, table2, table3 

Ваш пример

Cur.execute("truncate mytable;") 
+0

Как я могу избежать перечисления всех имен таблиц и просто обрезать все данные из всех таблиц? 'DELETE * FROM *;'? Или, может быть, 'TRUNCATE *'? – jml

+0

@jml проверить это http://stackoverflow.com/questions/2829158/truncating-all-tables-in-a-postgres-database – 8bitcat

+0

Этот код замораживает мою машину, так как существует параллельный исполняемый файл python, который распространяется дб. Можете ли вы предложить альтернативу? Считаете ли вы, что это может произойти из-за того, что база кода распространения опирается на идентификаторы? – jml

2

Этот SQL запрос должен удалить все записи из таблицы ...

DELETE FROM mytable; // not DELETE * FROM mytable; 
+2

Как указано в док: TRUNCATE быстро удаляет все строки из набора таблиц. Он имеет тот же эффект, что и неквалифицированный DELETE для каждой таблицы, но поскольку он фактически не сканирует таблицы, он работает быстрее. Кроме того, он немедленно восстанавливает дисковое пространство, а не требует последующей операции VACUUM. Это наиболее полезно для больших таблиц. Но DELETE безопаснее, если вы находитесь в параллельном контексте. –