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

caused by com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception unknown column

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

创建 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 并重新运行 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脚本是正确的。

据我了解,您正在使用 spring 引导和编写迁移脚本,我假设这是 flyway 或其他一些迁移工具。需要注意的一件事是,一旦迁移脚本 运行s 如果您没有将其配置为对迁移或迁移可能使用的任何其他配置进行验证,它就不会重新 运行。

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

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

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