我有旧的MySQL数据库,我需要在表中插入新列(以支持前端的新部分)。但是一些旧部件使用依赖于列数和顺序而不是其名称的SQL命令。 e.g:
INSERT INTO `data` VALUES (null /*auto-id*/, "name", "description", ...)
当我在此表中添加新列时,我得到the error:
1136 - 列数与第1行的值计数不匹配
现在我知道INSERT需要更改为:
INSERT INTO `data` (`name`, `desc`, ...) VALUES ("name", "description", ...)
问题是:是否还有其他命令可以使用依赖于列的顺序或数量而不是其名称的类似语法?我需要在更新之前更新所有旧的SQL命令数据库和使用trial & error方法会很长。
SELECT不是问题,因为前端使用关联映射并在任何地方正确使用它们的名称,因此只会忽略新列。此外,我确定没有修改数据库结构的命令(例如ALTER TABLE)。
答案 0 :(得分:1)
您排除了修改查询的数据结构,因此这为我们留下了插入,更新,删除和选择。
插入你已经知道的。
更新需要指定每个更新的字段,因此大多数情况下都可以。但是,子查询可以在where子句中使用,而mysql允许多表更新,所以我的选择点周围应用。
删除适用于整个记录,因此没有任何额外字段会影响。但是,子查询可以在where子句中使用,因此我的选择点周围应用。
你试图排除选择,但你不应该。不仅最终结果集可以受到新字段的影响:
子查询可能使用select *
,而额外的字段可能会导致外部查询出错。例如,新引入的字段可能与外部查询中的另一个字段具有相同的名称,从而导致不明确的字段名称错误。
如果联合使用select *
,则在添加新字段后列数可能不匹配。
引入新字段也可能会影响自然联接。