java - 在数据库 sqlite 中插入
问题描述
如果我在数据库中有两个表
table1
id_app | description
id_app 是 table1 的主键
table2
id_person | name | id_app
(id_person, id_app) 是 table2 的主键
如果我执行这个:
this.stat = conn.createStatement();
String sql = "INSERT INTO `table2` (id_person,name,aplication) VALUES (\""+id_person+"\", \""+name+"\", \""+aplication+"\")";
stat.executeUpdate(sql);
我可以插入一个未在 table1 中定义的应用程序的人,这可行吗?或者我在我的数据库中定义了错误?我可以在我的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`)
);
解决方案
您缺少从to的FOREIGN KEY限制。外键限制告诉数据库在允许该列中的值之前确保值存在。table2
table1
table1
table2
修改问题后编辑
想到了两个想法:
您是否启用了 FOREIGN KEY 支持?
在 SQLite 的某些设置中,外键功能要么未编译,要么已编译但默认禁用。对于后一种情况,您可能必须使用 PRAGMA 指令启用它。
我通常不将 TEXT 列设置为 PRIMARY KEY。如果您可以将
id_app
列重构为 INTEGER 类型,您可能会取得更大的成功。
推荐阅读
- json - Kotlin 中 JSONArray 中的 MutableList
- templates - Prestashop 1.6 - 存储在数据库和订单页面后,“已发货”模板中未显示跟踪号
- google-app-engine - App Engine:如何在本地导入 Datastore
- android - kWS Android Web 服务器无法打开 JSP 文件
- cmd - CMD 命令:Conjuction [wsgen: wsdl 和 inlineScemas]
- apache-spark - 您如何查看 pyspark 中为 Window 函数创建的分区大小?
- c++ - 错误:'operator*' 不匹配(操作数类型为 'QGenericMatrix<4, 4, float>' 和 'QGenericMatrix<4, 3, float>')
- php - 电报机器人不起作用:来自 webhook 的错误响应:找到 302
- html - 如何在angularjs的ng-options中使用json对象设置键和值
- javascript - 防止在 react-simple-maps 中出现蓝色路径矩形