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`.
,很抱歉我编辑了它,虽然这可以从理论上回答这个问题,但在这里包括答案的基本部分,并提供链接供参考。