在工作中我们有一个SQL Server数据库。我不太了解数据库。我在表中为一些新功能....创建了一个新列我马上开始看到错误
我的声明是这样的:
ALTER TABLE users
ADD locked varchar(50) NULL
GO
错误是:
插入错误:列名或提供的值数量与表定义不匹配
我读到,当在INSERT操作期间,提供的列名数量或提供的值数量与表定义不匹配时,会出现错误消息。
但是我已经检查了很多次,我已经改变了PHP代码,包括这个列的数据,但我仍然收到错误。
我直接在数据库上运行SQL查询,仍然得到错误。
有趣的是,得到错误的查询是一个Update。
UPDATE "users"
SET "users"."date_last_login" = GETDATE()
WHERE id = 1
你有没有考虑过这可能是一个触发因素?
这是您将得到的错误信息。
如果它是一个Update动作导致它检查触发动作更新表运行。
用:
#sp_helptrigger Users, 'UPDATE';
这将显示与' update '操作一起发生的触发器。
如果有一个触发器,获取触发器的名称并运行下面的命令(但将TriggerNameHere替换为真实的触发器):
#sp_helptext TriggerNameHere;
这将为您提供触发器运行的任何SQL,可能是错误消息所指的INSERT。
希望能有所帮助
除了TRIGGERS
,
这样做的原因是因为您正在使用INSERT
语句的implicit
类型。假设之前表上的列数是3。你有INSERT
语句的语法,
INSERT INTO tableName VALUES ('val1','val2','val3')
执行正常。但随后您修改了表,添加了另一列。所有的INSERT
查询都只在表上插入三个值,这与列的总数不匹配。
为了解决这个问题,你必须更新所有的INSERT
语句,在表中插入4个值,
INSERT INTO tableName VALUES ('val1','val2','val3', 'val4')
,它将正常工作。
我建议您使用INSERT
的EXPLICIT
类型,其中您必须指定要插入值的列。例如,
INSERT INTO tableName (col1, col2, col3) VALUES ('val1','val2','val3')
通过这种方式,即使您通过添加额外的列更改了表,您的INSERT
语句也不会受到影响,除非该列没有默认值并且不可为空。