我在使用SQL Server时遇到一些困难,我正在创建一个名为GUEST
的表并使用date
作为数据类型,而不是null,并且默认值为'today'且约束为日期必须等于或晚于2010年12月1日。
但是,当我尝试通过插入具有默认值的行进行测试时遇到问题。
如何让SQL Server显示当前日期而不是默认为{00}的默认getDate()
,其默认值为1900-01-01,其与我的约束条件的日期冲突必须晚于01 -dec-2010
INSERT INTO GUEST
VALUES('John' ,'');
导致错误:
INSERT语句与CHECK约束“chk_DATEJOINED”冲突。冲突发生在表“dbo.GUEST”,列'dateJoined'。
我已经做了一些代码来展示
CREATE TABLE GUEST
(
[...]
guestNum int NOT NULL IDENTITY(5,1),
name varchar(40) NOT NULL,
dateJoined date NOT NULL DEFAULT GETDATE()
[...]
CONSTRAINT chk_DATEJOINED
CHECK (dateJoined >= CAST('01-dec-2010' as DATETIME))
)
答案 0 :(得分:1)
SELECT CAST('' as DATE) returns 1900-01-01;
所以你的insert语句试图隐式插入的是1900-01-01,因为你传递了值''。如果您希望插入使用默认值,则必须将其完全排除。
INSERT INTO EMPLOYEE(Name) VALUES('John');
会做的伎俩
答案 1 :(得分:0)
如果您想尝试默认值,则无需将值传递给日期字段。 ' '是一个有效的字符串字符,它变成了1900-01-01'转换为日期类型时。在插入查询时也会提到列名称,如下所示。如果您没有在INSERT语句中提及列名,SQL Server将尝试以默认的列顺序插入数据。
INSERT INTO Employee (name, ..OtherColumns) --mention the name of other columns if required
VALUES ('John',OtherColumnsValues)
答案 2 :(得分:0)
你应该使用这个
INSERT INTO EMPLOYEE_test(name) VALUES('John');
您的查询等于INSERT INTO EMPLOYEE VALUES('John' , CAST('' as datetime))
当您使用查询INSERT INTO EMPLOYEE VALUES('John' ,'');
SQLServer
时,会尝试将''
转换为数据时间,即1900-01-01
,这样您就会收到该错误。
答案 3 :(得分:0)
这可以通过多种方式完成。
1)像其他人一样指出。说明要填充哪些列并跳过dateJoined列。insert into Employee ( name ) values ( 'John' )
2)使用default关键字作为值。
insert into Employee ( name, dateJoined ) values ( 'John', default )
如果要在代码中构建SQL语句并希望显式设置列列表,则default关键字很有用。如果列上没有默认约束,则默认关键字默认为null,因此请注意声明为非null的列。
答案 4 :(得分:0)
尝试这个插入语句。 插入#EMPLOYEE(姓名) 价值观('约翰');