CREATE 或 REPLACE 语句会影响雪花的时间旅行吗?

And*_*y S 6 snowflake-cloud-data-platform

如果我在雪花中创建一个表,然后使用 CREATE OR REPLACE 语句创建另一个同名的表,我将无法使用时间旅行访问第一个表的内容。

例如,如果我运行这段代码

CREATE TABLE "MY_DB"."MY_SCHEMA"."MY_TABLE" (COL1 VARCHAR, COL2 NUMBER);   
INSERT INTO "MY_DB"."MY_SCHEMA"."MY_TABLE" VALUES ('A',1);
Run Code Online (Sandbox Code Playgroud)

...然后在五分钟内运行这段代码

CREATE OR REPLACE TABLE "MY_DB"."MY_SCHEMA"."MY_TABLE" (COL1 VARCHAR, COL2 NUMBER);
INSERT INTO "MY_DB"."MY_SCHEMA"."MY_TABLE" VALUES ('B',2);
SELECT * FROM "MY_DB"."MY_SCHEMA"."MY_TABLE"
UNION
SELECT * FROM "MY_DB"."MY_SCHEMA"."MY_TABLE" AT (offset => -60*1)
Run Code Online (Sandbox Code Playgroud)

该查询仅返回第二个表中的值。这种行为是预期的吗?我试图用谷歌搜索这个或在雪花文档中找到澄清,但没有任何运气......

谢谢

Fel*_*ffa 12

更新:参见@peterb回答“通过在模式级别使用时间旅行来恢复旧表”


正如迈克所说,前一个表已随 一起删除CREATE AND REPLACE,因此时间旅行将无法找到它。

尽管如此,您仍然可以通过重命名新表并取消删除前一个表来恢复数据:

CREATE TABLE "test_travel" (COL1 VARCHAR, COL2 NUMBER);   
INSERT INTO "test_travel" VALUES ('A',1);

CREATE OR REPLACE TABLE "test_travel" (COL1 VARCHAR, COL2 NUMBER);   
INSERT INTO "test_travel" VALUES ('B',2);

ALTER TABLE "test_travel" RENAME TO "test_travel2";

UNDROP TABLE "test_travel";

SELECT *
FROM "test_travel" AT (offset => -60*1)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

https://docs.snowflake.com/en/user-guide/data-time-travel.html#restoring-objects


小智 8

您还可以通过在架构级别使用时间旅行将旧表恢复到运行创建或替换表之前的时间:

create schema "MY_DB"."MY_SCHEMA_RESTORED" clone "MY_DB"."MY_SCHEMA" AT (offset => -60*1)
Run Code Online (Sandbox Code Playgroud)

  • 哦,我喜欢这种方法 (2认同)

Mik*_*ton 5

是的 - 这是预期的。通过运行 CREATE OR REPLACE,您已删除原始表并将其替换为新表。替换表发布之前不会有时间旅行数据。

如果您希望从表中删除数据并保留数据用于时间旅行,请改用TRUNCATE TABLE语句。

https://docs.snowflake.com/en/sql-reference/sql/truncate-table.html

  • 还有“插入覆盖” - https://docs.snowflake.com/en/sql-reference/sql/insert.html#insert-using-overwrite (2认同)