【问题标题】:Insertion in database sqlite [duplicate]在数据库sqlite中插入[重复]
【发布时间】:2018-06-14 13:08:01
【问题描述】:

如果我在数据库中有两个表

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`)
);

【问题讨论】:

    标签: java sqlite


    【解决方案1】:

    您缺少从table2table1FOREIGN KEY 限制。外键限制告诉数据库在允许table2 列中的值之前确保值存在于table1

    修改问题后编辑

    想到两个想法:

    1. 启用外键支持了吗?

      在 SQLite 的某些设置中,外键功能要么未编译,要么已编译但默认禁用。对于后一种情况,您可能需要enable it with a PRAGMA directive

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

    【讨论】:

    • 我编辑我的问题是因为我使用的是外键,所以我觉得这样工作很奇怪
    • 我可以假设...REFERENCES `Aplication`... 在问题的上下文中应该是...REFERENCES `table1`... 吗?
    • 是的,对不起。我编辑它
    【解决方案2】:

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

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

    如果要启用外键强制,您需要执行语句 PRAGMA foreign_keys=1;。我相信您需要为每个新的Connection 执行此操作,但我可能弄错了。 1 可以替换为 trueyeson

    您还可以使用Properties 参数在使用DriverManager.getConnection(String, Properties) 打开它时配置Connection。您没有在问题中提及它,但由于这是 Java 并且您使用的是 SQLite,我假设您使用的是 xerial/sqlite-jdbc 提供的驱动程序。该库提供了SQLiteConfig 类,该类具有以下便捷方法:enforceForeignKeys(boolean)

    您可以使用SQLiteConfig.toProperties()SQLiteConfig 实例转换为Properties

    【讨论】:

      【解决方案3】:

      您可以在数据库结构中使用外键:

      https://www.sqlite.org/foreignkeys.html

      【讨论】:

      • 虽然理论上这可以回答这个问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。
      猜你喜欢
      • 2016-03-04
      • 2010-12-03
      • 2012-12-06
      • 1970-01-01
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      相关资源
      最近更新 更多