将标识列添加到 Snowflake 中的现有表?

Mai*_*upo 3 sql primary-key snowflake-cloud-data-platform

我在 Snowflake 中有一个表“MY_TABLE”,我想向其中添加一个标识列。我试过

ALTER TABLE "MY_TABLE" 
    ADD COLUMN primary_key int IDENTITY(1,1);
Run Code Online (Sandbox Code Playgroud)

但这返回

SQL compilation error: Cannot add column 'PRIMARY_KEY' with non-constant default to non-empty table 'MY_TABLE'.
Run Code Online (Sandbox Code Playgroud)

这在雪花中是不可能的吗?

为了解决这个限制,我尝试创建一个临时版本的表

CREATE OR REPLACE TABLE "MY_TABLE_TEMP" LIKE "MY_TABLE"
ALTER TABLE "MY_TABLE_TEMP" ADD COLUMN primary_key int IDENTITY(1,1)

INSERT INTO "MY_TABLE_TEMP"
    SELECT * FROM "MY_TABLE";
Run Code Online (Sandbox Code Playgroud)

但现在我得到了错误

SQL compilation error: Insert value list does not match column list expecting <x+1> but got <x>
Run Code Online (Sandbox Code Playgroud)

哪种有意义,因为我没有传递主键。在这一点上,似乎我可能必须手动将列名的 x 列表(这是一个非常高的数字)输入到 sql 查询中,所以我想知道我是否只是做错了这一切。有没有其他人遇到过类似的问题?

Raj*_*Deb 6

你能试试这个吗

CREATE TABLE TEST_TABLE_TEMP LIKE TEST_TABLE;
ALTER TABLE TEST_TABLE_TEMP ADD COLUMN primary_key int IDENTITY(1,1);

create or replace sequence seq_01 start = 1 increment = 1;

INSERT INTO TEST_TABLE_TEMP 
SELECT *,seq_01.NEXTVAL FROM TEST_TABLE;

SELECT * FROM TEST_TABLE_TEMP;
Run Code Online (Sandbox Code Playgroud)


Fel*_*ffa 5

IDENTITY您可以使用自己的方法SEQUENCE为每一行创建唯一的 id,而不是使用。

使用序列修复问题中的示例:

CREATE OR REPLACE SEQUENCE seq1;
CREATE OR REPLACE TABLE "MY_TABLE_TEMP" LIKE "MY_TABLE";

ALTER TABLE "MY_TABLE_TEMP" 
ADD COLUMN primary_key int DEFAULT seq1.nextval;


INSERT INTO "MY_TABLE_TEMP"
SELECT *, seq1.nextval 
FROM "MY_TABLE";
Run Code Online (Sandbox Code Playgroud)

(发布这个答案后,我注意到它与 Rajib 的非常相似)


小智 -1

只是一种预感,但是您是否尝试过在插入语句中包含 target_col_name 。我假设如果您不指定它们,则需要您刚刚在 select 语句中添加的附加列。