与外键约束有困难。

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

Struggling with a foreign key constraint

问题

  1. 我在定义一些外键时遇到了问题
  2. 我有一个发行者Issuer),每个发行者有一个地址Address)。
  3. 我有一个地址Address),每个地址有一个国家Country)。
  4. 我试图在这些POJO上使用Liquibase定义外键约束但是没有成功仍然出现相同的错误
  5. Caused by: liquibase.exception.DatabaseException: Column "COUNTRY_ID" not found; SQL statement:
  6. 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)]
  7. 这是我的类
  8. @Entity
  9. @Table(name = "COUNTRY")
  10. @SequenceGenerator(name = "seq_country", sequenceName = "SEQ_COUNTRY", allocationSize = 1)
  11. public class Country {
  12. // ...(略去其他代码)
  13. }
  14. @Entity
  15. @Table(name = "ADDRESS")
  16. @SequenceGenerator(name = "seq_address", sequenceName = "SEQ_ADDRESS", allocationSize = 1)
  17. public class Address {
  18. // ...(略去其他代码)
  19. }
  20. @Entity
  21. @Table(name = "ISSUER")
  22. @SequenceGenerator(name = "seq_issuer", sequenceName = "SEQ_ISSUER", allocationSize = 1)
  23. public class Issuer {
  24. // ...(略去其他代码)
  25. }
  26. <changeSet id="sremy" author="DEV-194-01">
  27. <dropColumn tableName="ASSET" columnName="LEGAL_ADDRESS"/>
  28. <dropColumn tableName="ASSET" columnName="MAIL_ADDRESS"/>
  29. <dropColumn tableName="ASSET" columnName="COMPANY_CONTACT_REF"/>
  30. <dropColumn tableName="ASSET" columnName="OTHER_CONTACT_REF"/>
  31. <dropColumn tableName="ASSET" columnName="COMPANY"/>
  32. <dropColumn tableName="ASSET" columnName="COUNTRY"/>
  33. </changeSet>
  34. <changeSet id="sremy" author="DEV-194-02">
  35. <createTable tableName="COUNTRY">
  36. <!-- ...略去其他代码 -->
  37. </createTable>
  38. <!-- ...略去其他代码 -->
  39. </changeSet>
  40. <changeSet id="sremy" author="DEV-194-03">
  41. <createTable tableName="ADDRESS">
  42. <!-- ...略去其他代码 -->
  43. </createTable>
  44. <addForeignKeyConstraint baseTableName="ADDRESS" baseColumnNames="COUNTRY_ID"
  45. constraintName="FK_ADDRESS_TO_COUNTRY" referencedTableName="COUNTRY"
  46. referencedColumnNames="ID"/>
  47. </changeSet>
  48. <changeSet author="sremy" id="DEV-194-04">
  49. <createTable tableName="ISSUER">
  50. <!-- ...略去其他代码 -->
  51. </createTable>
  52. <addForeignKeyConstraint baseTableName="ISSUER" baseColumnNames="ADDRESS_ID"
  53. constraintName="FK_ISSUER_TO_ADDRESS" referencedTableName="ADDRESS"
  54. referencedColumnNames="ID"/>
  55. </changeSet>
  56. <changeSet id="sremy" author="DEV-194-05">
  57. <addColumn tableName="ASSET">
  58. <!-- ...略去其他代码 -->
  59. </addColumn>
  60. <addForeignKeyConstraint
  61. baseTableName="ASSET" baseColumnNames="ISSUER_ID"
  62. referencedTableName="ISSUER" referencedColumnNames="ID"
  63. constraintName="FK_ASSET_TO_ISSUER"/>
  64. </changeSet>

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

  1. <details>
  2. <summary>英文:</summary>
  3. I do have a problem defining some foreign keys.
  4. I have an Issuer, who have one address.
  5. I have an Address who have one country.
  6. I&#39;m trying to define my foreign keys constraints with liquibse on those POJO, but with no luck, still same error:
  7. Caused by: liquibase.exception.DatabaseException: Column &quot;COUNTRY_ID&quot; not found; SQL statement:
  8. 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)]
  9. Here are my classes
  10. @Entity
  11. @Table(name = &quot;COUNTRY&quot;)
  12. @SequenceGenerator(name = &quot;seq_country&quot;, sequenceName = &quot;SEQ_COUNTRY&quot;, allocationSize = 1)
  13. public class Country {
  14. @Id
  15. @Column(name = &quot;ID&quot;)
  16. @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = &quot;seq_country&quot;)
  17. private Long id;
  18. @Column(name = &quot;SHORT_NAME&quot;)
  19. private String shortName;
  20. @Column(name = &quot;NAME&quot;)
  21. private String name;
  22. @OneToMany(mappedBy = &quot;country&quot;, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
  23. private List&lt;Address&gt; addresses;
  24. public Long getId() {
  25. return id;
  26. }
  27. public void setId(Long id) {
  28. this.id = id;
  29. }
  30. public String getShortName() {
  31. return shortName;
  32. }
  33. public void setShortName(String shortName) {
  34. this.shortName = shortName;
  35. }
  36. public String getName() {
  37. return name;
  38. }
  39. public void setName(String name) {
  40. this.name = name;
  41. }
  42. public List&lt;Address&gt; getAddresses() {
  43. return addresses;
  44. }
  45. public void setAddresses(List&lt;Address&gt; addresses) {
  46. this.addresses = addresses;
  47. }
  48. ----------
  49. @Entity
  50. @Table(name = &quot;ADDRESS&quot;)
  51. @SequenceGenerator(name = &quot;seq_address&quot;, sequenceName = &quot;SEQ_ADDRESS&quot;, allocationSize = 1)
  52. public class Address {
  53. @Id
  54. @Column(name = &quot;ID&quot;)
  55. @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = &quot;seq_address&quot;)
  56. private Long id;
  57. @Column(name = &quot;ADDRESS&quot;)
  58. private String address;
  59. @Column(name = &quot;POSTAL_CODE&quot;)
  60. private String postalCode;
  61. @Column(name = &quot;CITY&quot;)
  62. private String city;
  63. @ManyToOne(cascade = CascadeType.ALL)
  64. @JoinColumn(name = &quot;COUNTRY_ID&quot;)
  65. private Country country;
  66. @OneToOne(mappedBy = &quot;address&quot;)
  67. private Issuer issuer;
  68. public Long getId() {
  69. return id;
  70. }
  71. public void setId(Long id) {
  72. this.id = id;
  73. }
  74. public String getAddress() {
  75. return address;
  76. }
  77. public void setAddress(String address) {
  78. this.address = address;
  79. }
  80. public String getPostalCode() {
  81. return postalCode;
  82. }
  83. public void setPostalCode(String postalCode) {
  84. this.postalCode = postalCode;
  85. }
  86. public String getCity() {
  87. return city;
  88. }
  89. public void setCity(String city) {
  90. this.city = city;
  91. }
  92. public Country getCountry() {
  93. return country;
  94. }
  95. public void setCountry(Country country) {
  96. this.country = country;
  97. }
  98. public Issuer getIssuer() {
  99. return issuer;
  100. }
  101. public void setIssuer(Issuer issuer) {
  102. this.issuer = issuer;
  103. }
  104. ----------
  105. @Entity
  106. @Table(name = &quot;ISSUER&quot;)
  107. @SequenceGenerator(name = &quot;seq_issuer&quot;, sequenceName = &quot;SEQ_ISSUER&quot;, allocationSize = 1)
  108. public class Issuer {
  109. @Id
  110. @Column(name = &quot;ID&quot;)
  111. @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = &quot;seq_issuer&quot;)
  112. private Long id;
  113. @Column(name = &quot;NAME&quot;)
  114. private String name;
  115. @OneToOne(cascade = CascadeType.ALL)
  116. @JoinColumn(name = &quot;ADDRESS_ID&quot;)
  117. private Address address;
  118. @Column(name = &quot;MAIL_ADDRESS&quot;)
  119. private String emailAddress;
  120. @Column(name = &quot;COMPANY_CONTACT_REF&quot;)
  121. private String contactPerson;
  122. @Column(name = &quot;OTHER_CONTACT_REF&quot;)
  123. private String otherContactPerson;
  124. @OneToMany(mappedBy = &quot;issuer&quot;, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
  125. private Collection&lt;Asset&gt; assets;
  126. public Long getId() {
  127. return id;
  128. }
  129. public void setId(Long id) {
  130. this.id = id;
  131. }
  132. public String getName() {
  133. return name;
  134. }
  135. public void setName(String name) {
  136. this.name = name;
  137. }
  138. public String getEmailAddress() {
  139. return emailAddress;
  140. }
  141. public void setEmailAddress(String emailAddress) {
  142. this.emailAddress = emailAddress;
  143. }
  144. public String getContactPerson() {
  145. return contactPerson;
  146. }
  147. public void setContactPerson(String contactPerson) {
  148. this.contactPerson = contactPerson;
  149. }
  150. public String getOtherContactPerson() {
  151. return otherContactPerson;
  152. }
  153. public void setOtherContactPerson(String otherContactPerson) {
  154. this.otherContactPerson = otherContactPerson;
  155. }
  156. public Collection&lt;Asset&gt; getAssets() {
  157. return assets;
  158. }
  159. public void setAssets(Collection&lt;Asset&gt; assets) {
  160. this.assets = assets;
  161. }
  162. public Address getAddress() {
  163. return address;
  164. }
  165. public void setAddress(Address address) {
  166. this.address = address;
  167. }
  168. }
  169. ----------
  170. &lt;changeSet id=&quot;sremy&quot; author=&quot;DEV-194-01&quot;&gt;
  171. &lt;dropColumn tableName=&quot;ASSET&quot; columnName=&quot;LEGAL_ADDRESS&quot;/&gt;
  172. &lt;dropColumn tableName=&quot;ASSET&quot; columnName=&quot;MAIL_ADDRESS&quot;/&gt;
  173. &lt;dropColumn tableName=&quot;ASSET&quot; columnName=&quot;COMPANY_CONTACT_REF&quot;/&gt;
  174. &lt;dropColumn tableName=&quot;ASSET&quot; columnName=&quot;OTHER_CONTACT_REF&quot;/&gt;
  175. &lt;dropColumn tableName=&quot;ASSET&quot; columnName=&quot;COMPANY&quot;/&gt;
  176. &lt;dropColumn tableName=&quot;ASSET&quot; columnName=&quot;COUNTRY&quot;/&gt;
  177. &lt;/changeSet&gt;
  178. &lt;changeSet id=&quot;sremy&quot; author=&quot;DEV-194-02&quot;&gt;
  179. &lt;createTable tableName=&quot;COUNTRY&quot;&gt;
  180. &lt;column name=&quot;ID&quot; type=&quot;BIGINT&quot;&gt;
  181. &lt;constraints nullable=&quot;false&quot;/&gt;
  182. &lt;/column&gt;
  183. &lt;column name=&quot;CODE_ALPHA_2&quot; type=&quot;VARCHAR(2)&quot;/&gt;
  184. &lt;column name=&quot;NAME&quot; type=&quot;VARCHAR(50)&quot;/&gt;
  185. &lt;/createTable&gt;
  186. &lt;addPrimaryKey tableName=&quot;COUNTRY&quot; columnNames=&quot;ID&quot;
  187. constraintName=&quot;PK_COUNTRY&quot;/&gt;
  188. &lt;createSequence sequenceName=&quot;SEQ_COUNTRY&quot;/&gt;
  189. &lt;/changeSet&gt;
  190. &lt;changeSet id=&quot;sremy&quot; author=&quot;DEV-194-03&quot;&gt;
  191. &lt;createTable tableName=&quot;ADDRESS&quot;&gt;
  192. &lt;column name=&quot;ID&quot; type=&quot;BIGINT&quot;&gt;
  193. &lt;constraints nullable=&quot;false&quot;/&gt;
  194. &lt;/column&gt;
  195. &lt;column name=&quot;ADDRESS&quot; type=&quot;VARCHAR(250)&quot;/&gt;
  196. &lt;column name=&quot;POSTAL_CODE&quot; type=&quot;VARCHAR(20)&quot;/&gt;
  197. &lt;column name=&quot;CITY&quot; type=&quot;VARCHAR(250)&quot;/&gt;
  198. &lt;/createTable&gt;
  199. &lt;addPrimaryKey tableName=&quot;ADDRESS&quot; columnNames=&quot;ID&quot;
  200. constraintName=&quot;PK_ADDRESS&quot;/&gt;
  201. &lt;createSequence sequenceName=&quot;SEQ_ADDRESS&quot;/&gt;
  202. &lt;addForeignKeyConstraint baseTableName=&quot;ADDRESS&quot; baseColumnNames=&quot;COUNTRY_ID&quot;
  203. constraintName=&quot;FK_ADDRESS_TO_COUNTRY&quot; referencedTableName=&quot;COUNTRY&quot;
  204. referencedColumnNames=&quot;ID&quot;/&gt;
  205. &lt;/changeSet&gt;
  206. &lt;changeSet author=&quot;sremy&quot; id=&quot;DEV-194-04&quot;&gt;
  207. &lt;createTable tableName=&quot;ISSUER&quot;&gt;
  208. &lt;column name=&quot;ID&quot; type=&quot;BIGINT&quot;&gt;
  209. &lt;constraints nullable=&quot;false&quot;/&gt;
  210. &lt;/column&gt;
  211. &lt;column name=&quot;NAME&quot; type=&quot;VARCHAR(250)&quot;&gt;
  212. &lt;/column&gt;
  213. &lt;column name=&quot;MAIL_ADDRESS&quot; type=&quot;VARCHAR(250)&quot;&gt;
  214. &lt;/column&gt;
  215. &lt;column name=&quot;COMPANY_CONTACT_REF&quot; type=&quot;VARCHAR(250)&quot;&gt;
  216. &lt;/column&gt;
  217. &lt;column name=&quot;OTHER_CONTACT_REF&quot; type=&quot;VARCHAR(250)&quot;&gt;
  218. &lt;/column&gt;
  219. &lt;/createTable&gt;
  220. &lt;addPrimaryKey tableName=&quot;ISSUER&quot; columnNames=&quot;ID&quot;
  221. constraintName=&quot;PK_ISSUER&quot;/&gt;
  222. &lt;createSequence sequenceName=&quot;SEQ_ISSUER&quot;/&gt;
  223. &lt;addForeignKeyConstraint baseTableName=&quot;ISSUER&quot; baseColumnNames=&quot;ADDRESS_ID&quot;
  224. constraintName=&quot;FK_ISSUER_TO_ADDRESS&quot; referencedTableName=&quot;ADDRESS&quot;
  225. referencedColumnNames=&quot;ID&quot;/&gt;
  226. &lt;/changeSet&gt;
  227. &lt;changeSet id=&quot;sremy&quot; author=&quot;DEV-194-05&quot;&gt;
  228. &lt;addColumn tableName=&quot;ASSET&quot;&gt;
  229. &lt;column name=&quot;ISSUER_ID&quot; type=&quot;BIGINT&quot;&gt;
  230. &lt;constraints nullable=&quot;false&quot;/&gt;
  231. &lt;/column&gt;
  232. &lt;/addColumn&gt;
  233. &lt;addForeignKeyConstraint
  234. baseTableName=&quot;ASSET&quot; baseColumnNames=&quot;ISSUER_ID&quot;
  235. referencedTableName=&quot;ISSUER&quot; referencedColumnNames=&quot;ID&quot;
  236. constraintName=&quot;FK_ASSET_TO_ISSUER&quot;/&gt;
  237. &lt;/changeSet&gt;
  238. &lt;/databaseChangeLog&gt;
  239. If someone had the same problem, or see something awful in here, don&#39;t hesitate!
  240. Thanks, Stephanie
  241. </details>
  242. # 答案1
  243. **得分**: 0
  244. 首先,首先,在ADDRESS表中您没有列名COUNTRY_ID,但您仍然在尝试使用此列创建外键
  1. &lt;addForeignKeyConstraint baseTableName=&quot;ADDRESS&quot; baseColumnNames=&quot;COUNTRY_ID&quot;
  2. constraintName=&quot;FK_ADDRESS_TO_COUNTRY&quot;
  3. referencedTableName=&quot;COUNTRY&quot;
  4. referencedColumnNames=&quot;ID&quot;/&gt;
  1. 将基本列名从COUNTRY_ID更改为ID
  2. <details>
  3. <summary>英文:</summary>
  4. 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
  1. &lt;addForeignKeyConstraint baseTableName=&quot;ADDRESS&quot; baseColumnNames=&quot;COUNTRY_ID&quot;
  2. constraintName=&quot;FK_ADDRESS_TO_COUNTRY&quot;
  3. referencedTableName=&quot;COUNTRY&quot;
  4. referencedColumnNames=&quot;ID&quot;/&gt;
  1. change the base column name from COUNTRY_ID to ID
  2. </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:

确定