在雪花中,如果我使用create并在create命令中声明主键,主键中的所有列都会自动生成“null”。但是,如果创建一个没有主键的表,并使用alter命令添加主键,则可空列不会更改为“null”。
这是否被认为是雪花中的一个bug,还是我应该假设这是预期的行为?
即使在创建主键之后,Column3仍然是可空的:
create table Table1 (
Column1 TEXT(16777216),Column2 NUMBER(38,0) NOT NULL,Column3 NUMBER(38,0) IDENTITY START 3 INCREMENT 7,Column4 NUMBER(38,0) IDENTITY START 1 INCREMENT 1,Column7 NUMBER(38,0)
);
ALTER TABLE Table1 ADD CONSTRAINT Table1_PK PRIMARY KEY (Column2,Column3); 强制Column3为“null",尽管列定义允许为空,原因是主键:
create table Table1 (
Column1 TEXT(16777216),Column2 NUMBER(38,0) NOT NULL,Column3 NUMBER(38,0) IDENTITY START 3 INCREMENT 7,Column4 NUMBER(38,0) IDENTITY START 1 INCREMENT 1,Column7 NUMBER(38,0)
, CONSTRAINT Table1_PK PRIMARY KEY (Column2,Column3)
);发布于 2022-07-14 08:53:26
我不认为这是预期的行为,我建议你报告雪花支持,尽管有一个非常简单的解决办法。
@Lukasz所引用的页面有一个明确的声明:
在雪花中,主键约束被实现为NULL约束。
因此,如果它是作为NULL约束实现的,那么当将PK添加到现有列时,雪花应该添加NULL约束。
最终更新:我看到它已经被报道为"bug“(斯诺-549894)。开发团队认识到了缺陷行为,并计划修复(没有ETA) --目的是不允许主键列中的空值。为了验证此信息并要求更新,您可以提交一个案例来支持和引用我提供的号码。
发布于 2022-07-13 20:00:53
根据上面的评论,这是预期的行为。
请注意,这里的CREATE替换表与ALTER语句存在行为差异。
在创建表时,如果CREATE替换table命令中存在PK约束,则PK中定义的列将应用NULL属性。
如果表已经存在,ALTER可以添加PK,但不会更改PK中列的基本属性,也不会对表中的数据强制执行限制。
可以发出单独的ALTER命令,在现有表上将列属性更改为NULL。
请注意,虽然雪花将在列级别定义的列上强制执行NOT NULL,但它不会强制执行PK约束以防止表中的重复键(无论是历史上的还是前瞻性的)。
https://stackoverflow.com/questions/72967503
复制相似问题