SQL 语句“CREATE TABLE TRIP...”中的语法错误

Posted

技术标签:

【中文标题】SQL 语句“CREATE TABLE TRIP...”中的语法错误【英文标题】:Syntax error in SQL statement "CREATE TABLE TRIP..." 【发布时间】:2021-07-29 13:30:40 【问题描述】:

我在尝试使用 Flyway 和 Hibernate 为 PostgresSql 创建表时发现语法错误时遇到问题。 Trip 类与其他类(目前)没有关系。 我已经成功地为其他 2 个类 Purchase 和 User 创建了,但是这个只是给出了错误。

错误信息:

[错误] 测试运行:1,失败:0,错误:1,跳过:0,经过时间:3.003 秒

SQL 状态:42000 错误代码:42000 消息:SQL 语句中的语法错误“CREATE TABLE TRIP(ID BIGINT GENERATED BY DEFAULT AS IDENTITY, TITLE VARCHAR(255) NOT NULL, DESCRIPTION VARCHAR(255), COST INTEGER NOT NULL, LOCATION VARCHAR(124) NOT NULL, DEPARTURE DATE NOT NULL,返回日期不为 NULL,主键 (ID))

我的flyway sql脚本:

create sequence hibernate_sequence start with 1 increment by 1;

create table user_roles (user_email varchar(255) not null, roles varchar(255));

create table users (email varchar(255) not null, firstname varchar(50) not null, middle_name 
varchar(50), surename varchar(50) not null, password varchar(255) not null, address 
varchar(128) not null, postal_code varchar(124) not null, enabled boolean not null, primary 
key (email));

create table purchase (id bigint generated by default as identity, booked_date date not 
null, user_email varchar(255) not null, trip_id bigint not null, primary key (id));

create table trip (id bigint generated by default as identity, title varchar(255) not null, 
description varchar(255), cost integer not null, location varchar(128) not null, departure 
date not null, returning date not null, primary key (id))


alter table user_roles add constraint FKs9rxtuttxq2ln7mtp37s4clce foreign key (user_email)         
references users;

alter table purchase add constraint FKlqrv1aj0pon999jbi5esfpe4k foreign key (user_email) 
references users;

这是我的 Trip 实体:

package org.studentnr.backend.entities;

import javax.persistence.*;
import javax.validation.constraints.*;
import java.time.LocalDate;

@Entity
public class Trip 

 @Id @GeneratedValue
 private Long id;

 @NotBlank
 @Size(max=255)
 private String title;

 //@NotBlank //TODO: Can be blank???
 @Size(max=255)
 private String description;

 //@Min(0) TODO: remember to add 'check (cost>0)' to flyway to avoid using negative values
 @NotNull
 private Integer cost;

 @NotBlank
 @Size(max = 124)
 private String location;

 @NotNull
 @Future   
 private LocalDate departure;

 @NotNull
 @Future  
 private LocalDate returning;



public Trip()


public Long getId() 
    return id;


public void setId(Long id) 
    this.id = id;


public String getTitle() 
    return title;


public void setTitle(String title) 
    this.title = title;


public String getDescription() 
    return description;


public void setDescription(String description) 
    this.description = description;


public int getCost() 
    return cost;


public void setCost(int cost) 
    this.cost = cost;


public String getLocation() 
    return location;


public void setLocation(String location) 
    this.location = location;


public LocalDate getDepartureDate() 
    return departure;


public void setDepartureDate(LocalDate departureDate) 
    this.departure = departureDate;


public LocalDate getReturnDate() 
    return returning;


public void setReturnDate(LocalDate returnDate) 
    this.returning = returnDate;





【问题讨论】:

错误代码指向mysql,顺便说一句,你可以提到它。这个online checker 说,它是由by default as identity 引起的。有可用于 mysql create table 语句的文档。 generated by default as identity 适用于 PostgreSQL, Oracle, ... 但不适用于 MySQL。请改用id bigint auto_increment。 PS。 create sequence 也不适用于 MySQL。聚苯乙烯。 alter table .. add constraint .. foreign key (..) references users; 也不适用于 MySQL - 必须提供列定义以显式引用。 我正在使用 postgresSQL 很抱歉忘记提及!更新帖子。 请注意,255 的限制在性能或存储方面并没有超过 250 或 275 的优势,如果您希望该数字在存储中开启一些神奇的优化 @a_horse_with_no_name 我只是从我的老师讲课中获取示例。我不知道他为什么在他的一些变量中选择了 255 个字符。你有什么建议? 【参考方案1】:

您的脚本中有两个错误:

    create trip 语句末尾缺少 ;returning 是保留关键字。您必须引用它"returning" date - 但从长远来看,如果您找到不同的名称会更容易。

如果这两点都更正了,脚本works

我还会为外键约束使用更有意义的名称。

【讨论】:

在哪里可以找到所有保留关键字的列表?它曾经是 return_date 但我更改了它,因为我认为它可能与它在末尾被命名为“日期”有关,因为这也是一个保留字。问题只是分号';'顺便说一句,谢谢。 @Roozbeh postgresql.org/docs/current/sql-keywords-appendix.html

以上是关于SQL 语句“CREATE TABLE TRIP...”中的语法错误的主要内容,如果未能解决你的问题,请参考以下文章

sql语句加参数

sql语句时间排序 sql语句按照时间排序

带参数的sql语句!不懂

写出查询的SQL语句

使用sql语句查询日期的方法

sql语句实现表的字段名查询