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 查询中,所以我想知道我是否只是做错了这一切。有没有其他人遇到过类似的问题?
你能试试这个吗
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)
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 的非常相似)