为什么DMSsqlserver建表语句在dms执行会自动加上DEFAULT NULL ,导致执行失败CREATE TABLE [dbo].activity 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)
);工单号10216221
您好,根据sql执行错误提示来看是在执行sql时ActivityId默认加上了DEFAULT NULL,建议您设置DEFAULT NULL 为自增IDENTITY(1,1) NOT NULL,这样再尝试一下。
您遇到的这个问题是因为DMS在执行SQL Server建表语句时,默认会增加每个列的默认值约束。这个默认值约束如果和原语句冲突,就会导致执行失败。
具体来说,DMS在执行SQL Server建表时,会自动为非标识键列添加默认值约束,形式为:
COLUMN_NAME 数据类型 DEFAULT NULL
这个默认值会与原语句中的 NOT NULL 等约束冲突,因此执行失败。
需要注意的是,这个默认值约束的增加只会发生在使用DMS同步或执行SQL时,在SQL Server中直接执行创建表语句不会有这个问题。
要解决这个问题,您可以通过以下几种方式:
工单原因类别未被保存:如果在创建工单时,工单原因类别未被保存,您将无法查看工单原因类别。请检查工单原因类别是否已被保存。
工单原因类别已被删除:如果在创建工单时,工单原因类别已被删除,您将无法查看工单原因类别。请检查工单原因类别是否已被删除。
工单原因类别未被添加到工单中:如果在创建工单时,工单原因类别未被添加到工单中,您将无法查看工单原因类别。请检查工单原因类别是否已被添加到工单中。
如果你使用的是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的问题。
DMS是一款云数据库管理工具,它会自动为用户生成建表语句,包括默认值。在SQL Server中,如果一个列没有指定默认值,那么它的默认值就是NULL。因此,DMS会为每个列添加DEFAULT NULL,以确保列的默认值为NULL。
在您的建表语句中,所有列都被指定为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)
);
在上面的建表语句中,每个列都明确指定了默认值,因此DMS不会再自动添加DEFAULT NULL。
这可能是因为DMS系统在处理SQL Server的建表语句时,自动为所有列添加了默认值为NULL的约束。这可能是DMS系统的一个bug或者特性。
在你的SQL语句中,你已经为每个列定义了NOT NULL约束,这意味着这些列不能接受NULL值。在这种情况下,DMS系统不应该为这些列添加DEFAULT NULL约束,因为这会与你的定义冲突。
这个问题可以通过两种方式解决:
CREATE TABLE [dbo].activity (
...
Name VARCHAR(50) NOT NULL DEFAULT 'Default Name',
...
);
但是,这在这个情况下可能不适用,因为你已经明确地定义了每列都不能接受NULL值。
如果这个问题在DMS系统中普遍存在,建议你联系DMS的技术支持寻求解决方案,或者考虑使用其他数据库迁移工具。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。