在 SQLite3 中使用外键将行插入到不同的表中
Inserting rows into different tables using forein key in SQLite3
我正在为我的银行管理程序制作一个 sqlite3 数据库。为了创建 tables,我使用了以下脚本。
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...);
我希望在余额 table 中创建一行 account_id 1.
可能吗?如果是这样,我应该如何修改第一个代码块?
您需要 AFTER INSERT trigger
:
CREATE TRIGGER ins_balance AFTER INSERT ON account_profile
BEGIN
INSERT INTO balance(account_id) VALUES (NEW.account_id);
END;
但是,由于 2 table 之间存在 1:1
关系,并且 table balance
中唯一的列除了外键外,是 balance
,为什么还需要另一个 table?
您可以在 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
);
并且无需创建触发器,您可以避免级联更新、级联删除和调用触发器的开销。
我正在为我的银行管理程序制作一个 sqlite3 数据库。为了创建 tables,我使用了以下脚本。
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...);
我希望在余额 table 中创建一行 account_id 1.
可能吗?如果是这样,我应该如何修改第一个代码块?
您需要 AFTER INSERT trigger
:
CREATE TRIGGER ins_balance AFTER INSERT ON account_profile
BEGIN
INSERT INTO balance(account_id) VALUES (NEW.account_id);
END;
但是,由于 2 table 之间存在 1:1
关系,并且 table balance
中唯一的列除了外键外,是 balance
,为什么还需要另一个 table?
您可以在 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
);
并且无需创建触发器,您可以避免级联更新、级联删除和调用触发器的开销。