You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决JavaFX中SQL错误:表无匹配的唯一/主键约束

解决外键约束无效的问题

咱们直接戳核心问题:你的KIAD表中memberID列的类型与长度,和MEMBER表作为主键的ID列不匹配,这就是外键约束创建失败的根本原因。

问题拆解

错误信息里说:Constraint 'SQL190509155106120' is invalid: there is no unique or primary key constraint on table '"APP"."MEMBER"' that matches the number and types of the columns in the foreign key,翻译过来就是外键列的类型、长度必须和引用表的主键/唯一键完全一致,否则数据库无法识别这两个字段的关联关系,自然会拒绝创建约束。

看你的代码细节:

  • MEMBER表的主键ID是varchar(100)
  • KIAD表的memberID是varchar(200)

这两个字段的长度不一样,数据库就会判定它们不是匹配的关联字段,所以抛出了这个错误。

修复方案

把KIAD表中memberID的类型改成和MEMBER.ID完全一致的varchar(100)即可。修改后的setupKiadTable方法代码如下:

void setupKiadTable() { 
    String TABLE_NAME = "KIAD"; 
    try { 
        stmt = conn.createStatement(); 
        DatabaseMetaData dbm = conn.getMetaData(); 
        ResultSet tables = dbm.getTables(null, null, TABLE_NAME.toUpperCase(), null); 
        if (tables.next()){ 
            System.out.println("A " + TABLE_NAME + " asztal már készen áll!"); 
        } else { 
            stmt.execute("CREATE TABLE " + TABLE_NAME + "(" + 
                " bookID varchar(200) primary key,\n" + 
                " memberID varchar(100),\n" + // 这里改为varchar(100),与MEMBER.ID保持一致
                " kiadTime timestamp default CURRENT_TIMESTAMP,\n" + 
                " megujit_count integer default 0,\n" + 
                " FOREIGN KEY (bookID) REFERENCES BOOK(id),\n" + 
                " FOREIGN KEY (memberID) REFERENCES MEMBER(ID))\n"); 
        } 
    } catch (SQLException e) { 
        System.err.println(e.getMessage() + " --- adatbázis felállítás"); 
    } finally { 
    } 
}

另外提个小建议:KIAD表把bookID设为主键,意味着同一本书只能被借出一次。如果你的业务场景是同一本书允许多次借出(比如多副本),那这个设计没问题;但如果BOOK.id是单本书的唯一标识,建议把KIAD的主键改成组合主键(比如bookID + memberID + kiadTime)或者新增自增主键列,避免业务逻辑冲突。

内容的提问来源于stack exchange,提问作者Csicsek Máté

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:22:54