SQL Server突然不遵守默认值

时间:2018-12-04 18:20:03

标签: sql sql-server tsql sqlalchemy

我正在运行脚本以使用SQLAlchamy填充SQL Server 2017数据库上的表。该脚本在几周前完美运行。

本质上,服务器似乎没有在不可为空的字段上填充默认值。

例如,当我运行以下语句(由SQLA呈现)时:

 INSERT INTO concept
        (
                    retired,
                    short_name,
                    description,
                    form_text,
                    datatype_id,
                    class_id,
                    is_set,
                    creator,
                    date_created,
                    version,
                    changed_by,
                    date_changed,
                    retired_by,
                    date_retired,
                    retire_reason,
                    uuid,
                    note_regex
        )
        VALUES
        (
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?
        )'] [parameters: (0,
                    'ck',
                    'creatine phosphokinase',
                    None,
                    14,
                    49,
                    0,
                    0,
                    None,
                    None,
                    None,
                    None,
                    None,
                    None,
                    None,
                    'cf6443ff-f2a1-49ab-96e3-c5d6fac362ed', None)] 

我收到错误:

Cannot insert the value NULL into column 'date_created',
table 'myositis_longetudinal_cohort.dbo.concept'; column does not allow
nulls. INSERT fails. (515)

这让我感到困惑,因为date_created字段的默认值为getdate()

这是约束语句:

ALTER TABLE [dbo].[concept]
ADD CONSTRAINT [DF__concept__date_cr__62AFA012] DEFAULT (Getdate()) FOR
[date_created]  

我是SQL Server的新手,不确定我可能缺少的内容。该服务器的更新时间为11/15/18,但我没有在更新中看到任何可以解释此更改的信息。

在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

    INSERT INTO concept
    (
                retired,
                short_name,
                description,
                form_text,
                datatype_id,
                class_id,
                is_set,
                creator,
                date_created,  <--SPECIFYING HERE MEANS DEFAULT WON'T BE USED
                version,
                changed_by,
                date_changed,
                retired_by,
                date_retired,
                retire_reason,
                uuid,
                note_regex
    )

参数:

[parameters: (
 0,                         <-- retired,  
 'ck',                      <-- short_name,     
 'creatine phosphokinase',  <-- description,                         
 None,                      <-- form_text,     
 14,                        <-- datatype_id,   
 49,                        <-- class_id,   
 0,                         <-- is_set,  
 0,                         <-- creator,  
 None,                      <-- date_created   (provided with NULL)  
 None,
 None,
 None,
 None,
 None,
 None,
 'cf6443ff-f2a1-49ab-96e3-c5d6fac362ed', 
 None
 )] 

表中具有NON_NULL_DEFAULT + NOTNULL_CONSTRAINT的所有其他列也会发生相同的问题

关于突然开始发生的可能性:

  • SQLAlchemy从未用于生成指定此列的插入
  • 已添加NOT NULL约束
  • 在传递null的情况下提供值的触发器已被删除,重新编码或禁用

答案 1 :(得分:-1)

感谢大家。

事实证明,这是一个SQLAlchemy问题。

我必须将autoload: true添加到__table_args__中,而不是手动定义每个列。显然,如果您不允许SQLA对表进行内部检查,则它将生成NULL作为值传递,而不是按照@larnu等建议的生成插入语句时跳过该值。