【发布时间】:2019-02-18 04:47:37
【问题描述】:
假设我们在尝试将新行插入到表中时收到UNIQUE constraint failed 错误。
该行由多个主键组成,这些主键被链接以创建一个复合键约束,即由id、id_x、id_y 和id_z。
第一个 id 键必须是“自动递增”的 unique 键,而 id_x、id_y 和 id_z 是 foreign keys。
由于我们不能在 sqlite 中的 composite key 上使用 auto-increment 功能,因此我们使用以下触发器来查找每个触发器的最大整数字段并加 1 以满足 uniqueness 约束:
CREATE TRIGGER [autoincrement]
AFTER INSERT
ON table_main
WHEN NEW.id IS NULL
BEGIN
UPDATE table_main
SET id = IFNULL((SELECT MAX(id) FROM table_main) + 1, 0),
id_x = IFNULL((SELECT MAX(id_x) FROM table_main) + 1, 0),
id_y = IFNULL((SELECT MAX(id_y) FROM table_main) + 1, 0),
id_z = IFNULL((SELECT MAX(id_z) FROM table_main) + 1, 0);
END;
尽管如此,我们仍然收到UNIQUE constraint failed 错误。
更新:id_z 有一个 forign key 约束。
【问题讨论】:
-
请阅读minimal reproducible example并采取行动。这包括提供 DDL & 示例输入 & 所需输出 & 实际输出,包括错误消息。研究你的错误提示了什么? “链接的几个主键”是什么意思?如果您只想要列集的子行值的唯一性,那么您不应将各个列本身声明为 PK,因为这也表明每个列都是唯一的。您的意思是各个列都是 FK 吗?这就是 MCVE 的原因。另请阅读 NULL 在 UNIQUE 和 FK 中的作用。
-
我觉得奇怪的是,在您在
table_main中插入一行之前,您正在更新table_main中的所有行。因此,table_main中可能只有一行,它是product_inventory键的下一个数字控制器,在这种情况下,您不想在插入product_inventory之前触发触发器吗? -
很抱歉造成混乱,但
product_inventory实际上应该是table_main。
标签: python-3.x sqlite auto-increment composite-primary-key