开发者社区 > 数据库 > 数据库管理工具 > 正文

为什么DMSsqlserver建表语句在dms执行会自动加上DEFAULT NULL 导致执行失败?

为什么DMSsqlserver建表语句在dms执行会自动加上DEFAULT NULL ,导致执行失败CREATE TABLE [dbo].[activity]
ActivityId INT IDENTITY(1,1) NOT NULL,
Name VARCHAR(50) NOT NULL,
Closed BIT NOT NULL,
Sort INT NOT NULL,
StartTime DATETIME NOT NULL,
EndTime DATETIME NOT NULL,
Description nvarchar(1000) NOT NULL,
Expand VARCHAR(500) NOT NULL,
LastUpdateUserId INT NOT NULL,
LastUpdateTime DATETIME NOT NULL,
CreateUserId INT NOT NULL,
CreateTime DATETIME NOT NULL,
IsDelete BIT NOT NULL,
PRIMARY KEY (ActivityId)
);cd3eac883c9e9f47edba15b74b5adcb0.png2375d841d9e10fa9153ebfd31c8fd7ef.png工单号10216221

展开
收起
奔放或澜 2023-08-29 17:51:22 177 0
6 条回答
写回答
取消 提交回答
  • 从事java行业9年至今,热爱技术,热爱以博文记录日常工作,csdn博主,座右铭是:让技术不再枯燥,让每一位技术人爱上技术

    您好,根据sql执行错误提示来看是在执行sql时ActivityId默认加上了DEFAULT NULL,建议您设置DEFAULT NULL 为自增IDENTITY(1,1) NOT NULL,这样再尝试一下。

    2023-10-08 18:17:11
    赞同 展开评论 打赏
  • 您遇到的这个问题是因为DMS在执行SQL Server建表语句时,默认会增加每个列的默认值约束。这个默认值约束如果和原语句冲突,就会导致执行失败。
    具体来说,DMS在执行SQL Server建表时,会自动为非标识键列添加默认值约束,形式为:
    COLUMN_NAME 数据类型 DEFAULT NULL
    这个默认值会与原语句中的 NOT NULL 等约束冲突,因此执行失败。
    需要注意的是,这个默认值约束的增加只会发生在使用DMS同步或执行SQL时,在SQL Server中直接执行创建表语句不会有这个问题。
    要解决这个问题,您可以通过以下几种方式:

    1. 在创建表语句中直接指定默认值,使其不再自动添加默认值。
    2. 在DMS任务配置中关闭这个默认值补全功能。
    3. 在语句最后增加一段修改默认值的语句,让其符合预期。
    4. 将创建表语句分成CREATE TABLE和ALTER TABLE两条语句,先创建表结构,再修改默认值。
    5. 使用不确定DEFAULT值的方式定义列,例如:COL1 int NULL。
      综上,明确DMS这个默认值自动增加的特性后,可以通过多种方式规避这个问题,实现建表语句的正常执行。
    2023-10-08 14:23:01
    赞同 展开评论 打赏
  • 工单原因类别未被保存:如果在创建工单时,工单原因类别未被保存,您将无法查看工单原因类别。请检查工单原因类别是否已被保存。
    工单原因类别已被删除:如果在创建工单时,工单原因类别已被删除,您将无法查看工单原因类别。请检查工单原因类别是否已被删除。
    工单原因类别未被添加到工单中:如果在创建工单时,工单原因类别未被添加到工单中,您将无法查看工单原因类别。请检查工单原因类别是否已被添加到工单中。

    2023-09-29 13:13:32
    赞同 展开评论 打赏
  • 如果你使用的是SQL Server 2012或更高版本,可以考虑使用OFFSET子句来避免自动添加DEFAULT NULL。例如:

    CREATE TABLE [dbo].activity (  
        ActivityId INT NOT NULL,  
        Name VARCHAR(50) NOT NULL,  
        Closed BIT NOT NULL,  
        Sort INT NOT NULL,  
        StartTime DATETIME NOT NULL,  
        EndTime DATETIME NOT NULL,  
        Description NVARCHAR(1000) NOT NULL,  
        Expand VARCHAR(500) NOT NULL,  
        LastUpdateUserId INT NOT NULL,  
        LastUpdateTime DATETIME NOT NULL,  
        CreateUserId INT NOT NULL,  
        CreateTime DATETIME NOT NULL,  
        IsDelete BIT NOT NULL,  
        PRIMARY KEY (ActivityId)  
    ) OFFSET 0 ROWS;
    

    这样可以避免自动添加DEFAULT NULL的问题。

    2023-09-26 16:55:49
    赞同 1 展开评论 打赏
  • 1.问题原因:

    DMS是一款云数据库管理工具,它会自动为用户生成建表语句,包括默认值。在SQL Server中,如果一个列没有指定默认值,那么它的默认值就是NULL。因此,DMS会为每个列添加DEFAULT NULL,以确保列的默认值为NULL。

    2.解决方法:

    在您的建表语句中,所有列都被指定为NOT NULL,但是DMS仍然会自动添加DEFAULT NULL。这导致了执行失败,因为您的建表语句与DMS生成的建表语句不一致。

    为了解决这个问题,您可以尝试在建表语句中明确指定每个列的默认值,例如:

    CREATE TABLE [dbo].activity (
    ActivityId INT NOT NULL,
    Name VARCHAR(50) NOT NULL DEFAULT '',
    Closed BIT NOT NULL DEFAULT 0,
    Sort INT NOT NULL DEFAULT 0,
    StartTime DATETIME NOT NULL DEFAULT '1900-01-01 00:00:00',
    EndTime DATETIME NOT NULL DEFAULT '1900-01-01 00:00:00',
    Description nvarchar(1000) NOT NULL DEFAULT '',
    Expand VARCHAR(500) NOT NULL DEFAULT '',
    LastUpdateUserId INT NOT NULL DEFAULT 0,
    LastUpdateTime DATETIME NOT NULL DEFAULT '1900-01-01 00:00:00',
    CreateUserId INT NOT NULL DEFAULT 0,
    CreateTime DATETIME NOT NULL DEFAULT '1900-01-01 00:00:00',
    IsDelete BIT NOT NULL DEFAULT 0,
    PRIMARY KEY (ActivityId)
    );

    3.结论:

    在上面的建表语句中,每个列都明确指定了默认值,因此DMS不会再自动添加DEFAULT NULL。

    3.下图为帮助文档提供的解决方案:

    image.png
    image.png

    2023-09-23 16:14:34
    赞同 展开评论 打赏
  • 全栈JAVA领域创作者

    这可能是因为DMS系统在处理SQL Server的建表语句时,自动为所有列添加了默认值为NULL的约束。这可能是DMS系统的一个bug或者特性。

    在你的SQL语句中,你已经为每个列定义了NOT NULL约束,这意味着这些列不能接受NULL值。在这种情况下,DMS系统不应该为这些列添加DEFAULT NULL约束,因为这会与你的定义冲突。

    这个问题可以通过两种方式解决:

    1. 检查并修改DMS系统的行为。如果它是可配置的,你可以调整它的设置,使其不再为NOT NULL列添加DEFAULT NULL约束。如果它不能被配置,你可能需要联系DMS系统的技术支持,让他们解决这个问题。
    2. 在你的SQL语句中明确地定义列的默认值。即使你已经定义了列的NOT NULL约束,你仍然可以为列定义默认值。例如,你可以使用以下语法为列定义默认值:
    CREATE TABLE [dbo].activity (
        ...
        Name VARCHAR(50) NOT NULL DEFAULT 'Default Name',
        ...
    );
    

    但是,这在这个情况下可能不适用,因为你已经明确地定义了每列都不能接受NULL值。

    如果这个问题在DMS系统中普遍存在,建议你联系DMS的技术支持寻求解决方案,或者考虑使用其他数据库迁移工具。

    2023-09-19 14:15:15
    赞同 展开评论 打赏
滑动查看更多

阿里云提供了一系列数据库管理工具,可以满足您在云上进行数据库管理的各种需求。包含数据传输服务DTS、数据库备份 DBS、数据库自治服务 DAS、数据管理 DMS。

相关产品

  • 数据管理
  • 热门讨论

    热门文章

    相关电子书

    更多
    金融行业高频交易数据管理解决方案 立即下载
    基于Spark的统一数据管理与数据探索平台 立即下载
    INFINIDATA:基于Spark的统一数据管理与探索平台 立即下载