由com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception未知列引起

时间:2016-08-07 01:14:53

标签: mysql spring-boot mybatis spring-mybatis

我使用springboot + mybatis并使用SpringJUnit4ClassRunner运行,使用默认数据库h2和脚本:

create table sql:

create TABLE IF NOT EXISTS `test_company` (
  `id`          bigint   unsigned  not null auto_increment,
  `pid`         bigint   DEFAULT null COMMENT '',
  `outer_id`    bigint DEFAULT null COMMENT '',
  `name`        VARCHAR(256) DEFAULT NULL COMMENT '',
  `parent_company_name` VARCHAR(256) DEFAULT NULL COMMENT '',
  `user_id` bigint DEFAULT NULL COMMENT '用户ID',
  `user_name` VARCHAR(64) DEFAULT NULL COMMENT '',
  `type`        INTEGER DEFAULT null COMMENT '',
  `level`       INTEGER DEFAULT null COMMENT '',
  `status`      INTEGER DEFAULT null COMMENT ''
);

模特公司:

@Data
@NoArgsConstructor
public class Company implements Serializable {

    private static final long serialVersionUID = -5822686079080905768L;
    private Long id;    private Long pid;
    private Long outerId;
    private String name;
    private String parentCompanyName;
    private Long userId;
    private String userName;
    private Integer type;
    private Integer level;    
    private Integer status;
}

mapper的resultMap:

<resultMap id="CompanyMap" type="Company">
    <id column="id" property="id"/>
    <result column="pid" property="pid"/>
    <result column="outer_id" property="outerId"/>
    <result column="name" property="name"/>
    <result column="parent_company_name" property="parentCompanyName"/>
    <result column="user_id" property="userId"/>
    <result column="user_name" property="userName"/>
    <result column="type" property="type"/>
    <result column="level" property="level"/>
    <result column="status" property="status"/>
</result>

一些sqls:

<sql id="tb">
    test_company
</sql>

<sql id="cols_all">
    id, <include refid="cols_exclude_id" />
</sql>

<sql id="cols_exclude_id">
    pid, outer_id, `name`, `parent_company_name`, user_id, user_name, `type`, `level`, status
</sql>

<sql id="vals">
    #{pid}, #{outerId}, #{name}, #{parentCompanyName}, #{userId}, #{userName}, #{type}, #{level}, #{status}
</sql>

创建sql:

<insert id="create" parameterType="Company" keyProperty="id" useGeneratedKeys="true">
    INSERT INTO
    <include refid="tb" />
    (<include refid="cols_exclude_id" />)
    VALUES
    (<include refid="vals" />)
</insert>

在没有列parent_company_name

之前它运行良好

但是当我添加列parent_company_name并使用create重新运行DAO方法时出现此错误

    org.springframework.jdbc.BadSqlGrammarException: 
### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'parent_company_name' in 'field list'
### The error may involve Company.create-Inline
### The error occurred while setting parameters

我的IDE是IntelliJ IDEA,我不知道它是否由缓存或其他东西引起,我只是添加了一个新列并检查了所有sql脚本是否正确。

1 个答案:

答案 0 :(得分:0)

根据我的理解,您正在使用Spring启动和编写迁移脚本,我假设这是flyway或其他一些迁移工具。需要注意的一点是,一旦迁移脚本运行,如果您没有将其配置为在迁移或迁移可能正在使用的任何其他配置上进行验证,则它将不会重新运行。

因此,您应该检查数据库以查看列是否实际创建。如果不是,那么您将不得不编写第二个迁移脚本来更改现有表,而不是将parent_company_name列插入到初始脚本中。因此,您的第2版迁移将具有:

ALTER TABLE `test_company` ADD COLUMN `parent_company_name` VARCHAR(256) DEFAULT NULL COMMENT '';

或者,如果您正在使用flyway且仍处于开发模式,则可以在迁移时进行验证并将验证错误设置为true,以便清除数据库并重新运行迁移脚本。