DotNetNext / SqlSugar

.Net aot ORM Fastest ORM Simple Easy VB.NET Sqlite orm Oracle ORM Mysql Orm 虚谷数据库 postgresql ORm SqlServer oRm 达梦 ORM 人大金仓 ORM 神通ORM C# ORM , C# ORM .NET ORM NET5 ORM .NET6 ORM ClickHouse orm QuestDb ,TDengine ORM,OceanBase orm,GaussDB orm ,Tidb orm Object/Relational Mapping
https://www.donet5.com/Home/Doc
MIT License
5.17k stars 1.32k forks source link

PG数据库添加字段默认值问题 #1250

Closed hhb0220 closed 1 week ago

hhb0220 commented 2 weeks ago

PG数据库在已经生成且有数据的表中添加非空字段并指定默认值,设定的默认值在字段新增的时候无效.

DotNetNext commented 2 weeks ago

image

hhb0220 commented 2 weeks ago

我试了一下还是有问题,场景是我表已经建好了且已经有数据,现在新增一个非空字段,由于新增非空字段不设置默认值数据库会报错,所以如果我使用sql:ALTER table table_name add col_name varchar(255) not null default 'default_value' 来做这件事,是没问题的, 而且已有数据的这列都会是设置的默认值. 但是如果使用以上两个属性,无论怎么搭配都达不到这个效果,我log了sql,其中新增列的update语句没有拿到我设置的默认值.至于为什么想达到这个效果,是为了新老数据的这列值保持一定的统一性. 不知道是不是我食用方式还是有问题.

DotNetNext commented 2 weeks ago

以前的数据处理不了,只能保证新加的数据 ,以前数据 字符串我给的是空

DotNetNext commented 2 weeks ago

还有疑问提供可以重现的DEMO,我不是很明白你的意思

hhb0220 commented 2 weeks ago

倒数第二回答我已经了解了。我以为新增字段设置默认值和ALTER table table_name add col_name varchar(255) not null default 'default_value' 这个sql达到的效果一样。我现在的疑问是为什么从直观上,新增字段的默认值处理和数据库原生逻辑不同?用sql给有数据老表添加非空指定默认值字段,应该是很常规的操作。而codefirst这里加字段对默认值的处理结果和原生sql不一致,有点反直觉。想知道是出于什么考虑。感谢解惑🫡

DotNetNext commented 2 weeks ago

我没办法处理你是字符串还是函数,所以老数据都统一给了默认值,新数据 你用插入会生效

DotNetNext commented 2 weeks ago

默认值的情况太多了

DotNetNext commented 2 weeks ago

SqlSugarCore 5.1.4.159 更新到最新版本,按你的要求改了

DotNetNext commented 1 week ago

还有问题吗?

DotNetNext commented 1 week ago

长时间未回复,先关闭,有问题发新的issue,关闭后不会在看