2017-08-05 61 views
0

SQL的新手,使用PostgreSQL。无需手动删除创建的表即可运行查询

我正在尝试一些初学者的问题,但我有一个问题。 要确保在测试的东西我就不会遇到任何未知错误,我写的查询步骤即

CREATE TABLE x(...); 

... 

run query.. 

CREATE TABLE x(...); 

CREATE TABLE y(...); 

run query 

---等。

问题是,我创建了一个表格之后,我不得不删除它,如果我想尝试并再次运行查询,否则我得到的

'ERROR: relation "x" already exists.'

似乎是一个很重要的问题,但环顾四周后,在stackoverflow中,谷歌,postgre的网站,我还没有找到任何东西。

回答

1

您可以删除表(如果存在),也可以根据您的需要创建表(如果表不存在)。

DROP TABLE IF EXISTS tableName ...

CREATE TABLE IF NOT EXISTS tableName ...

检查出creating a tabledropping a table的documenation。

+0

但让我们说我改变了其中一个表中的东西,它仍然会删除它吗?还是将它作为“新”表读取? – Immanuel

+0

@Immanuel如果删除表格,它将删除所有内容。但是,如果您创建了一个已经存在的新表,它只会将行附加到表中,并保留所有现有数据。 – Matthew

+0

所以我将不得不使用'IF NOT EXISTS'来创建我创建的每个表是否正确?有没有什么'全包'? – Immanuel

0

如果你真的只是练习和数据并不重要,你可以使用TEMPORARY表。然后一个简单的断开和重新连接将它们扔掉,并给你一个干净的石板。

CREATE TEMPORARY TABLE x(...); 

或者你甚至可以使用事务范围内的临时表,这是在提交或回滚下降:

BEGIN; 

CREATE TEMPORARY TABLE x(...) ON COMMIT DROP; 

INSERT ... 

COMMIT; 

或者,当然,你可以做你的迭代开发的一个交易,你最后是ROLLBACK

BEGIN; 

CREATE TABLE x(...); 

INSERT ... 

ROLLBACK; 
+0

我得到了一个不同的'错误:对永久表的限制可能只引用永久表' – Immanuel

+0

@Immanuel您必须在测试中使用所有临时表或所有永久表。您不能将永久表中的外键约束设置为临时表,反之亦然。 –

1

你不应该使用临时表 - 除非你有这样做的具体表现(或其他)原因。

而是使用公共表表达式(CTE的):

with x as (
     <code here> 
    ), 
    y as (
     <code here> 
    ), 
    . . . 
select . . . 

热膨胀系数是查询的一部分,所以他们不坚持之间运行查询。瞧!命名或临时表没有问题。