【问题标题】:Inserting rows into different tables using forein key in SQLite3在 SQLite3 中使用外键将行插入到不同的表中
【发布时间】:2021-03-11 11:38:17
【问题描述】:

我正在为我的银行管理程序制作一个 sqlite3 数据库。为了创建表格,我使用了以下脚本。

  1 CREATE TABLE account_profile(
  2     account_id INTEGER PRIMARY KEY,
  3     first_name TEXT NOT NULL,
  4     last_name TEXT NOT NULL,
  5     date_of_birth TEXT NOT NULL,
  6     phone TEXT UNIQUE NOT NULL,
  7     email TEXT UNIQUE NOT NULL
  8 );
  9 
 10 CREATE TABLE balance(
 11     account_id INTEGER PRIMARY KEY,
 12     balance REAL DEFAULT 0,
 13     FOREIGN KEY (account_id)
 14         REFERENCES account_profile (account_id)
 15         ON UPDATE CASCADE
 16         ON DELETE CASCADE
 17 );

现在使用如下插入命令

INSERT INTO account_profile(first_name, last_name, something...) values (something...); 

我希望在余额表中创建一个 account_id 为 1 的行。

有可能吗?如果是这样,我应该如何修改第一个代码块?

【问题讨论】:

    标签: sqlite triggers sql-insert


    【解决方案1】:

    你需要一个AFTER INSERT trigger

    CREATE TRIGGER ins_balance AFTER INSERT ON account_profile
    BEGIN 
      INSERT INTO balance(account_id) VALUES (NEW.account_id);
    END;
    

    但是,既然两个表之间存在1:1关系,并且表balance中除了外键之外唯一的列是balance,为什么还需要另一个表呢?
    您可以在account_profile 中包含balance 列:

    CREATE TABLE account_profile(
         account_id INTEGER PRIMARY KEY,
         first_name TEXT NOT NULL,
         last_name TEXT NOT NULL,
         date_of_birth TEXT NOT NULL,
         phone TEXT UNIQUE NOT NULL,
         email TEXT UNIQUE NOT NULL,
         balance REAL DEFAULT 0
    );
    

    并且无需创建触发器,您可以避免级联更新、级联删除和调用触发器的开销。

    【讨论】:

    • 感谢您的回复!这个解决方案效果很好。你的建议是有效的,但我想知道这样的触发是否可能以及如何做到这一点。
    猜你喜欢
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2019-04-13
    相关资源
    最近更新 更多