使用 liquibase 变更集,在创建表时尝试创建外键时收到错误。如果我对 postgres 数据库运行相同的查询,它会很好地创建表。
这是变更集
databaseChangeLog:
- changeSet:
id: create_address
author: m
labels: create
context: main
comment: Create address table
changes:
- createTable:
schemaName: public
tableName: ADDRESS
columns:
- column:
name: ID
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: STREET
type: varchar(250)
constraints:
nullable: false
- column:
name: STREET2
type: varchar(250)
constraints:
nullable:true
- column:
name: CITY
type: varchar(50)
constraints:
nullable: false
- column:
name: STATE_PROVINCE
type: varchar(50)
constraints:
nullable: false
- column:
name: COUNTRY
type: varchar(50)
constraints:
nullable: false
- column:
name: POSTAL_CODE
type: varchar(30)
constraints:
nullable: false
- column:
name: ACTIVE
type: boolean
constraints:
nullable: false
defaultValue: true
- column:
name: PERSON_ID
type: int
constraints:
nullable: false
foreignKeyName: FK_ADDRESS_PERSON
references: person(ID)
- column:
name: CREATED
type: timestamp
defaultValueComputed: CURRENT_TIMESTAMP
- column:
name: MODIFIED
type: timestamp
defaultValueComputed: CURRENT_TIMESTAMP
- column:
name: RECORD_TYPE
type: varchar(50)
constraints:
nullable: false
- column:
name: NOTE
type: varchar(50)
这是 sql 的错误消息:
Caused by: liquibase.exception.DatabaseException: ERROR: relation "person" does not exist [Failed SQL: (0) CREATE TABLE public.ADDRESS (ID INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL, STREET VARCHAR(250) NOT NULL, STREET2 VARCHAR(250), CITY VARCHAR(50) NOT NULL, STATE_PROVINCE VARCHAR(50) NOT NULL, COUNTRY VARCHAR(50) NOT NULL, POSTAL_CODE VARCHAR(30) NOT NULL, ACTIVE BOOLEAN DEFAULT TRUE NOT NULL, PERSON_ID INTEGER NOT NULL, CREATED TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(), MODIFIED TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(), RECORD_TYPE VARCHAR(50) NOT NULL, NOTE VARCHAR(50), CONSTRAINT "ADDRESS_pkey" PRIMARY KEY (ID), CONSTRAINT FK_ADDRESS_PERSON FOREIGN KEY (PERSON_ID) REFERENCES person(ID))]
如果我在 pgpadmin 中运行相同的 sql,它会毫无问题地创建表
CREATE TABLE public.ADDRESS
(ID INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL,
STREET VARCHAR(250) NOT NULL,
STREET2 VARCHAR(250),
CITY VARCHAR(50) NOT NULL,
STATE_PROVINCE VARCHAR(50) NOT NULL,
COUNTRY VARCHAR(50) NOT NULL,
POSTAL_CODE VARCHAR(30) NOT NULL,
ACTIVE BOOLEAN DEFAULT TRUE NOT NULL,
PERSON_ID INTEGER NOT NULL,
CREATED TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
MODIFIED TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
RECORD_TYPE VARCHAR(50) NOT NULL, NOTE VARCHAR(50),
CONSTRAINT "ADDRESS_pkey" PRIMARY KEY (ID),
CONSTRAINT FK_ADDRESS_PERSON FOREIGN KEY (PERSON_ID) REFERENCES PERSON(ID))
CREATE TABLE
Query returned successfully in 25 msec.
我更改了 liquibase 和 pgpadmin 中引用表的大小写,并得到了相同的结果。
请参阅上面的代码和结果
感谢您的回复。如果我取出外键约束,变更集将运行。因此,考虑到这一点,在创建表并起作用后,我将外键约束创建移至其自己的变更集。它有点笨拙,但它运行起来并创建了约束。我不会说这是一个解决方案,但它是一种解决方法,并且适用于我当前正在工作的工作。