Java 数据库sqlite中的插入

Java 数据库sqlite中的插入,java,sqlite,Java,Sqlite,如果数据库中有两个表 table1 id_app | description id_应用程序是表1的主键 table2 id_person | name | id_app (id_person,id_app)是表2的主键 如果我执行此命令: this.stat = conn.createStatement(); String sql = "INSERT INTO `table2` (id_person,name,aplication) VALUES (\""+id_person+"\", \

如果数据库中有两个表

table1
id_app | description
id_应用程序是表1的主键

table2
id_person | name | id_app
(id_person,id_app)是表2的主键

如果我执行此命令:

this.stat = conn.createStatement();
String sql = "INSERT INTO `table2` (id_person,name,aplication) VALUES (\""+id_person+"\", \""+name+"\", \""+aplication+"\")";
stat.executeUpdate(sql);
我可以使用表1中未定义的应用程序插入一个人,这是否可行?或者我在数据库中定义了错误的内容? 我可以在java程序中限制这一点,但我想知道是否有办法从数据库中限制这一点

我的数据库定义如下所示

CREATE TABLE `table1` (
  `id_app`      TEXT NOT NULL UNIQUE,
  `description` TEXT NOT NULL UNIQUE,
   PRIMARY KEY(`id_app`)
);

CREATE TABLE `table2` (
 `id_person`   TEXT NOT NULL UNIQUE,
 `aplication`  TEXT NOT NULL,
  FOREIGN KEY(`aplication`) REFERENCES `table1`(`id_app`),
  PRIMARY KEY(`id_person`,`aplication`)
);
您缺少从
表2
表1
的限制。外键限制告诉数据库在允许表2的
列中的值之前,确保表1中存在值

修改问题后编辑 我想到两个想法:

  • 您是否启用了外键支持

    在SQLite的某些设置中,外键功能不是在中编译,就是在中编译,但在默认情况下被禁用。对于后一种情况,您可能不得不这样做

  • 我通常不会将文本列设置为主键。如果您可以将
    id\u app
    列重构为整数类型,您可能会获得更大的成功


  • 您可以在DB结构中使用外键:


    SQLite默认情况下不强制外键,如下所述:

    从SQLite版本3.6.19开始,外键强制的默认设置为关闭。然而,在SQLite的未来版本中,这种情况可能会改变。可以在编译时使用SQLITE_default_foreign_KEYS预处理器宏指定外键强制的默认设置。为了尽量减少将来的问题,应用程序应根据应用程序的要求设置外键强制标志,而不依赖于默认设置

    您需要执行语句
    PRAGMA foreign\u keys=1如果要启用外键强制。我相信您需要为每个新的
    连接执行此操作,但我可能弄错了。
    1
    可替换为
    true
    yes
    on

    使用
    属性
    参数打开连接时,也可以配置连接。您在问题中没有提到它,但由于这是Java,您使用的是SQLite,所以我假设您使用的是由提供的驱动程序。此库提供具有以下方便方法的类:


    您可以将
    SQLiteConfig
    实例转换为
    Properties

    我编辑我的问题是因为我使用外键,这就是我认为这种方式很奇怪。我可以假设
    …引用`应用程序'…
    在问题的上下文中应该是
    …引用`表1`.
    ,很抱歉我编辑了它,虽然这可以从理论上回答这个问题,但在这里包括答案的基本部分,并提供链接供参考。