与外键约束有困难。

huangapple go评论180阅读模式
英文:

Struggling with a foreign key constraint

问题

我在定义一些外键时遇到了问题
我有一个发行者Issuer),每个发行者有一个地址Address)。
我有一个地址Address),每个地址有一个国家Country)。

我试图在这些POJO上使用Liquibase定义外键约束但是没有成功仍然出现相同的错误

Caused by: liquibase.exception.DatabaseException: Column "COUNTRY_ID" not found; SQL statement:
ALTER TABLE PUBLIC.ADDRESS ADD CONSTRAINT FK_ADDRESS_TO_COUNTRY FOREIGN KEY (COUNTRY_ID) REFERENCES PUBLIC.COUNTRY (ID) [42122-200] [Failed SQL: (42122) ALTER TABLE PUBLIC.ADDRESS ADD CONSTRAINT FK_ADDRESS_TO_COUNTRY FOREIGN KEY (COUNTRY_ID) REFERENCES PUBLIC.COUNTRY (ID)]

这是我的类

@Entity
@Table(name = "COUNTRY")
@SequenceGenerator(name = "seq_country", sequenceName = "SEQ_COUNTRY", allocationSize = 1)
public class Country {
    // ...(略去其他代码)
}

@Entity
@Table(name = "ADDRESS")
@SequenceGenerator(name = "seq_address", sequenceName = "SEQ_ADDRESS", allocationSize = 1)
public class Address {
    // ...(略去其他代码)
}

@Entity
@Table(name = "ISSUER")
@SequenceGenerator(name = "seq_issuer", sequenceName = "SEQ_ISSUER", allocationSize = 1)
public class Issuer {
    // ...(略去其他代码)
}

<changeSet id="sremy" author="DEV-194-01">
    <dropColumn tableName="ASSET" columnName="LEGAL_ADDRESS"/>
    <dropColumn tableName="ASSET" columnName="MAIL_ADDRESS"/>
    <dropColumn tableName="ASSET" columnName="COMPANY_CONTACT_REF"/>
    <dropColumn tableName="ASSET" columnName="OTHER_CONTACT_REF"/>
    <dropColumn tableName="ASSET" columnName="COMPANY"/>
    <dropColumn tableName="ASSET" columnName="COUNTRY"/>
</changeSet>
<changeSet id="sremy" author="DEV-194-02">
    <createTable tableName="COUNTRY">
        <!-- ...略去其他代码 -->
    </createTable>
    <!-- ...略去其他代码 -->
</changeSet>
<changeSet id="sremy" author="DEV-194-03">
    <createTable tableName="ADDRESS">
        <!-- ...略去其他代码 -->
    </createTable>
    <addForeignKeyConstraint baseTableName="ADDRESS" baseColumnNames="COUNTRY_ID"
                             constraintName="FK_ADDRESS_TO_COUNTRY" referencedTableName="COUNTRY"
                             referencedColumnNames="ID"/>
</changeSet>
<changeSet author="sremy" id="DEV-194-04">
    <createTable tableName="ISSUER">
        <!-- ...略去其他代码 -->
    </createTable>
    <addForeignKeyConstraint baseTableName="ISSUER" baseColumnNames="ADDRESS_ID"
                             constraintName="FK_ISSUER_TO_ADDRESS" referencedTableName="ADDRESS"
                             referencedColumnNames="ID"/>
</changeSet>
<changeSet id="sremy" author="DEV-194-05">
    <addColumn tableName="ASSET">
        <!-- ...略去其他代码 -->
    </addColumn>
    <addForeignKeyConstraint
            baseTableName="ASSET" baseColumnNames="ISSUER_ID"
            referencedTableName="ISSUER" referencedColumnNames="ID"
            constraintName="FK_ASSET_TO_ISSUER"/>
</changeSet>

如果有人遇到了相同的问题,或者在这里看到了什么问题,请不要犹豫!感谢,Stephanie


<details>
<summary>英文:</summary>

I do have a problem defining some foreign keys. 
I have an Issuer, who have one address. 
I have an Address who have one country.

I&#39;m trying to define my foreign keys constraints with liquibse on those POJO, but with no luck, still same error: 

    Caused by: liquibase.exception.DatabaseException: Column &quot;COUNTRY_ID&quot; not found; SQL statement:
    ALTER TABLE PUBLIC.ADDRESS ADD CONSTRAINT FK_ADDRESS_TO_COUNTRY FOREIGN KEY (COUNTRY_ID) REFERENCES PUBLIC.COUNTRY (ID) [42122-200] [Failed SQL: (42122) ALTER TABLE PUBLIC.ADDRESS ADD CONSTRAINT FK_ADDRESS_TO_COUNTRY FOREIGN KEY (COUNTRY_ID) REFERENCES PUBLIC.COUNTRY (ID)]

Here are my classes 

    @Entity
    @Table(name = &quot;COUNTRY&quot;)
    @SequenceGenerator(name = &quot;seq_country&quot;, sequenceName = &quot;SEQ_COUNTRY&quot;, allocationSize = 1)
    public class Country {
    
        @Id
        @Column(name = &quot;ID&quot;)
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = &quot;seq_country&quot;)
        private Long id;
    
        @Column(name = &quot;SHORT_NAME&quot;)
        private String shortName;
    
        @Column(name = &quot;NAME&quot;)
        private String name;
    
        @OneToMany(mappedBy = &quot;country&quot;, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
        private List&lt;Address&gt; addresses;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getShortName() {
            return shortName;
        }
    
        public void setShortName(String shortName) {
            this.shortName = shortName;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public List&lt;Address&gt; getAddresses() {
            return addresses;
        }
    
        public void setAddresses(List&lt;Address&gt; addresses) {
            this.addresses = addresses;
        }


----------

    @Entity
    @Table(name = &quot;ADDRESS&quot;)
    @SequenceGenerator(name = &quot;seq_address&quot;, sequenceName = &quot;SEQ_ADDRESS&quot;, allocationSize = 1)
    public class Address {
    
        @Id
        @Column(name = &quot;ID&quot;)
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = &quot;seq_address&quot;)
        private Long id;
    
        @Column(name = &quot;ADDRESS&quot;)
        private String address;
    
        @Column(name = &quot;POSTAL_CODE&quot;)
        private String postalCode;
    
        @Column(name = &quot;CITY&quot;)
        private String city;
    
        @ManyToOne(cascade = CascadeType.ALL)
        @JoinColumn(name = &quot;COUNTRY_ID&quot;)
        private Country country;
    
        @OneToOne(mappedBy = &quot;address&quot;)
        private Issuer issuer;
    
        public Long getId() {
    
            return id;
        }
    
        public void setId(Long id) {
    
            this.id = id;
        }
    
        public String getAddress() {
    
            return address;
        }
    
        public void setAddress(String address) {
    
            this.address = address;
        }
    
        public String getPostalCode() {
    
            return postalCode;
        }
    
        public void setPostalCode(String postalCode) {
    
            this.postalCode = postalCode;
        }
    
        public String getCity() {
    
            return city;
        }
    
        public void setCity(String city) {
    
            this.city = city;
        }
    
        public Country getCountry() {
            return country;
        }
    
        public void setCountry(Country country) {
            this.country = country;
        }
    
        public Issuer getIssuer() {
            return issuer;
        }
    
        public void setIssuer(Issuer issuer) {
            this.issuer = issuer;
        }


----------


    @Entity
    @Table(name = &quot;ISSUER&quot;)
    @SequenceGenerator(name = &quot;seq_issuer&quot;, sequenceName = &quot;SEQ_ISSUER&quot;, allocationSize = 1)
    public class Issuer {
    
        @Id
        @Column(name = &quot;ID&quot;)
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = &quot;seq_issuer&quot;)
        private Long id;
    
        @Column(name = &quot;NAME&quot;)
        private String name;
    
        @OneToOne(cascade = CascadeType.ALL)
        @JoinColumn(name = &quot;ADDRESS_ID&quot;)
        private Address address;
    
        @Column(name = &quot;MAIL_ADDRESS&quot;)
        private String emailAddress;
    
        @Column(name = &quot;COMPANY_CONTACT_REF&quot;)
        private String contactPerson;
    
        @Column(name = &quot;OTHER_CONTACT_REF&quot;)
        private String otherContactPerson;
    
        @OneToMany(mappedBy = &quot;issuer&quot;, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
        private Collection&lt;Asset&gt; assets;
    
        public Long getId() {
    
            return id;
        }
    
        public void setId(Long id) {
    
            this.id = id;
        }
    
        public String getName() {
    
            return name;
        }
    
        public void setName(String name) {
    
            this.name = name;
        }
    
        public String getEmailAddress() {
    
            return emailAddress;
        }
    
        public void setEmailAddress(String emailAddress) {
    
            this.emailAddress = emailAddress;
        }
    
        public String getContactPerson() {
    
            return contactPerson;
        }
    
        public void setContactPerson(String contactPerson) {
    
            this.contactPerson = contactPerson;
        }
    
        public String getOtherContactPerson() {
    
            return otherContactPerson;
        }
    
        public void setOtherContactPerson(String otherContactPerson) {
    
            this.otherContactPerson = otherContactPerson;
        }
    
        public Collection&lt;Asset&gt; getAssets() {
    
            return assets;
        }
    
        public void setAssets(Collection&lt;Asset&gt; assets) {
    
            this.assets = assets;
        }
    
        public Address getAddress() {
    
            return address;
        }
    
        public void setAddress(Address address) {
    
            this.address = address;
        }
    }

    


----------


    &lt;changeSet id=&quot;sremy&quot; author=&quot;DEV-194-01&quot;&gt;
        &lt;dropColumn tableName=&quot;ASSET&quot; columnName=&quot;LEGAL_ADDRESS&quot;/&gt;
        &lt;dropColumn tableName=&quot;ASSET&quot; columnName=&quot;MAIL_ADDRESS&quot;/&gt;
        &lt;dropColumn tableName=&quot;ASSET&quot; columnName=&quot;COMPANY_CONTACT_REF&quot;/&gt;
        &lt;dropColumn tableName=&quot;ASSET&quot; columnName=&quot;OTHER_CONTACT_REF&quot;/&gt;
        &lt;dropColumn tableName=&quot;ASSET&quot; columnName=&quot;COMPANY&quot;/&gt;
        &lt;dropColumn tableName=&quot;ASSET&quot; columnName=&quot;COUNTRY&quot;/&gt;
    &lt;/changeSet&gt;
    &lt;changeSet id=&quot;sremy&quot; author=&quot;DEV-194-02&quot;&gt;

        &lt;createTable tableName=&quot;COUNTRY&quot;&gt;
            &lt;column name=&quot;ID&quot; type=&quot;BIGINT&quot;&gt;
                &lt;constraints nullable=&quot;false&quot;/&gt;
            &lt;/column&gt;
            &lt;column name=&quot;CODE_ALPHA_2&quot; type=&quot;VARCHAR(2)&quot;/&gt;
            &lt;column name=&quot;NAME&quot; type=&quot;VARCHAR(50)&quot;/&gt;
        &lt;/createTable&gt;

        &lt;addPrimaryKey tableName=&quot;COUNTRY&quot; columnNames=&quot;ID&quot;
                       constraintName=&quot;PK_COUNTRY&quot;/&gt;
        &lt;createSequence sequenceName=&quot;SEQ_COUNTRY&quot;/&gt;

    &lt;/changeSet&gt;

    &lt;changeSet id=&quot;sremy&quot; author=&quot;DEV-194-03&quot;&gt;
        &lt;createTable tableName=&quot;ADDRESS&quot;&gt;
            &lt;column name=&quot;ID&quot; type=&quot;BIGINT&quot;&gt;
                &lt;constraints nullable=&quot;false&quot;/&gt;
            &lt;/column&gt;
            &lt;column name=&quot;ADDRESS&quot; type=&quot;VARCHAR(250)&quot;/&gt;
            &lt;column name=&quot;POSTAL_CODE&quot; type=&quot;VARCHAR(20)&quot;/&gt;
            &lt;column name=&quot;CITY&quot; type=&quot;VARCHAR(250)&quot;/&gt;
        &lt;/createTable&gt;

        &lt;addPrimaryKey tableName=&quot;ADDRESS&quot; columnNames=&quot;ID&quot;
                       constraintName=&quot;PK_ADDRESS&quot;/&gt;
        &lt;createSequence sequenceName=&quot;SEQ_ADDRESS&quot;/&gt;


        &lt;addForeignKeyConstraint baseTableName=&quot;ADDRESS&quot; baseColumnNames=&quot;COUNTRY_ID&quot;
                                 constraintName=&quot;FK_ADDRESS_TO_COUNTRY&quot; referencedTableName=&quot;COUNTRY&quot;
                                 referencedColumnNames=&quot;ID&quot;/&gt;
    &lt;/changeSet&gt;

    &lt;changeSet author=&quot;sremy&quot; id=&quot;DEV-194-04&quot;&gt;

        &lt;createTable tableName=&quot;ISSUER&quot;&gt;

            &lt;column name=&quot;ID&quot; type=&quot;BIGINT&quot;&gt;
                &lt;constraints nullable=&quot;false&quot;/&gt;
            &lt;/column&gt;
            &lt;column name=&quot;NAME&quot; type=&quot;VARCHAR(250)&quot;&gt;
            &lt;/column&gt;
            &lt;column name=&quot;MAIL_ADDRESS&quot; type=&quot;VARCHAR(250)&quot;&gt;
            &lt;/column&gt;
            &lt;column name=&quot;COMPANY_CONTACT_REF&quot; type=&quot;VARCHAR(250)&quot;&gt;
            &lt;/column&gt;
            &lt;column name=&quot;OTHER_CONTACT_REF&quot; type=&quot;VARCHAR(250)&quot;&gt;
            &lt;/column&gt;
        &lt;/createTable&gt;

        &lt;addPrimaryKey tableName=&quot;ISSUER&quot; columnNames=&quot;ID&quot;
                       constraintName=&quot;PK_ISSUER&quot;/&gt;
        &lt;createSequence sequenceName=&quot;SEQ_ISSUER&quot;/&gt;

        &lt;addForeignKeyConstraint baseTableName=&quot;ISSUER&quot; baseColumnNames=&quot;ADDRESS_ID&quot;
                                 constraintName=&quot;FK_ISSUER_TO_ADDRESS&quot; referencedTableName=&quot;ADDRESS&quot;
                                 referencedColumnNames=&quot;ID&quot;/&gt;

    &lt;/changeSet&gt;

    &lt;changeSet id=&quot;sremy&quot; author=&quot;DEV-194-05&quot;&gt;
        &lt;addColumn tableName=&quot;ASSET&quot;&gt;
            &lt;column name=&quot;ISSUER_ID&quot; type=&quot;BIGINT&quot;&gt;
                &lt;constraints nullable=&quot;false&quot;/&gt;
            &lt;/column&gt;
        &lt;/addColumn&gt;
        &lt;addForeignKeyConstraint
                baseTableName=&quot;ASSET&quot; baseColumnNames=&quot;ISSUER_ID&quot;
                referencedTableName=&quot;ISSUER&quot; referencedColumnNames=&quot;ID&quot;
                constraintName=&quot;FK_ASSET_TO_ISSUER&quot;/&gt;
    &lt;/changeSet&gt;

&lt;/databaseChangeLog&gt;

If someone had the same problem, or see something awful in here, don&#39;t hesitate! 

Thanks, Stephanie


</details>


# 答案1
**得分**: 0

首先,首先,在ADDRESS表中您没有列名COUNTRY_ID,但您仍然在尝试使用此列创建外键

&lt;addForeignKeyConstraint baseTableName=&quot;ADDRESS&quot; baseColumnNames=&quot;COUNTRY_ID&quot;
                         constraintName=&quot;FK_ADDRESS_TO_COUNTRY&quot; 
referencedTableName=&quot;COUNTRY&quot;
                         referencedColumnNames=&quot;ID&quot;/&gt;

将基本列名从COUNTRY_ID更改为ID。

<details>
<summary>英文:</summary>

First of all you don&#39;t have Column name COUNTRY_ID in ADDRESS table but you are still trying to create foreign key using this column
&lt;addForeignKeyConstraint baseTableName=&quot;ADDRESS&quot; baseColumnNames=&quot;COUNTRY_ID&quot;
                         constraintName=&quot;FK_ADDRESS_TO_COUNTRY&quot; 
referencedTableName=&quot;COUNTRY&quot;
                         referencedColumnNames=&quot;ID&quot;/&gt;
change the base column name from COUNTRY_ID to ID 

</details>



huangapple
  • 本文由 发表于 2020年9月8日 21:57:44
  • 转载请务必保留本文链接:https://go.coder-hub.com/63795512.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定