首页 > 解决方案 > 在数据库 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`)
);

标签: javasqlite

解决方案


您缺少从to的FOREIGN KEY限制。外键限制告诉数据库在允许该列中的值之前确保值存在。table2table1table1table2

修改问题后编辑

想到了两个想法:

  1. 您是否启用了 FOREIGN KEY 支持?

    在 SQLite 的某些设置中,外键功能要么未编译,要么已编译但默认禁用。对于后一种情况,您可能必须使用 PRAGMA 指令启用它

  2. 我通常不将 TEXT 列设置为 PRIMARY KEY。如果您可以将id_app列重构为 INTEGER 类型,您可能会取得更大的成功。


推荐阅读