我有两张主表,一张保存
products
,一张保存与产品相关的 costs
。问题是我需要一个链接表来组合两者(lookup
表),因为成本只知道代码,而产品只知道类。
(此构造是出于历史数据原因......)
我需要构建一个外键来确保每种产品都有价格。
一个简单的 MWE 是(暂时没有 FK)
-- only has class; no code...
CREATE TABLE products (
class TEXT NOT NULL,
color TEXT NOT NULL,
price REAL,
UNIQUE(class)
-- THIS is what I want; but b.c. COMBINED is a view and not a table, I get
-- the error later
-- FOREIGN KEY (class, color) REFERENCES COMBINED (class, color)
);
-- only code no class...
CREATE TABLE costs (
code TEXT NOT NULL,
color TEXT NOT NULL,
cost REAL,
UNIQUE(code, color)
);
-- link table for products and costs
CREATE TABLE lookup (
class TEXT NOT NULL,
code TEXT NOT NULL,
UNIQUE(class)
);
CREATE VIEW COMBINED AS
SELECT costs.code, lookup.class, costs.color
FROM costs LEFT JOIN lookup ON costs.class = lookup.class;
然后,测试数据:
INSERT INTO lookup (class, code) VALUES ('AAA', 'aaa'), ('BBB', 'bbb');
INSERT INTO costs (code, color, cost) VALUES ('aaa', 'red', 123), ('bbb', 'blue', 456);
INSERT INTO products (class, color, price) VALUES ('AAA', 'red', 0.123); -- should work
INSERT INTO products (class, color, price) VALUES ('CCC', 'red', 0.456); -- expect FK error on CCC
当我使用注释掉的外键时,我收到错误
foreign key mismatch - "products" referencing "COMBINED"
,因为 COMBINED 是视图而不是表。
有什么方法可以实现此目的,还是我需要使用触发器来确保成本始终具有匹配的列?
我还是觉得你弄得太复杂了
锁台是桥台
CREATE VIEW COMBINED AS
SELECT costs.code, lookup.class
FROM costs LEFT JOIN lookup ON costs.class = lookup.class;
CREATE TABLE costs (
code TEXT NOT NULL,
cost REAL,
UNIQUE(code)
);
✓
CREATE TABLE products (
class TEXT NOT NULL,
price REAL,
UNIQUE(class)
);
✓
PRAGMA foreign_keys = ON;
✓
CREATE TABLE lookup (
class TEXT NOT NULL,
code TEXT NOT NULL,
UNIQUE(class, code),
FOREIGN KEY (class) REFERENCES products (class),
FOREIGN KEY (code) REFERENCES costs (code)
);
✓
INSERT INTO costs (code, cost) VALUES ('aaa', 123), ('bbb', 456);
✓
INSERT INTO products (class, price) VALUES ('AAA', 0.123); -- should work
✓
INSERT INTO products (class, price) VALUES ('BBB', 0.346); -- should work
✓
INSERT INTO products (class, price) VALUES ('CCC', 0.456); -- expect FK error on CCC
✓
INSERT INTO lookup (class, code) VALUES ('AAA', 'aaa');
✓
INSERT INTO lookup (class, code) VALUES ('BBB', 'bbb');
✓
INSERT INTO lookup (class, code) VALUES ('DDD','ddd');
{ "code": "SQLITE_CONSTRAINT_FOREIGNKEY" }