如何生成满足多部分unqiue密钥的最低id



以下架构和INSERTs:

DROP TABLE IF EXISTS foo_bar;
DROP TABLE IF EXISTS foo;
CREATE TABLE foo (
foo_id INT PRIMARY KEY NOT NULL GENERATED ALWAYS AS IDENTITY,
baz VARCHAR UNIQUE NOT NULL
);
CREATE TABLE foo_bar (
foo_id INT NOT NULL,
bar_id INT NOT NULL GENERATED ALWAYS AS IDENTITY,
quux VARCHAR UNIQUE NOT NULL,
FOREIGN KEY(foo_id) REFERENCES foo(foo_id),
PRIMARY KEY(bar_id, foo_id)
);
INSERT INTO foo(baz) VALUES('baz1');
INSERT INTO foo(baz) VALUES('baz2');
INSERT INTO foo_bar(foo_id, quux) VALUES(1, 'quux 1/1');
INSERT INTO foo_bar(foo_id, quux) VALUES(1, 'quux 1/2');
INSERT INTO foo_bar(foo_id, quux) VALUES(2, 'quux 2/1');
INSERT INTO foo_bar(foo_id, quux) VALUES(2, 'quux 2/2');

给出结果:

mud=> select * from foo;
foo_id | baz  
--------+------
1 | baz1
2 | baz2
(2 rows)
mud=> select * from foo_bar;
foo_id | bar_id |   quux   
--------+--------+----------
1 |      1 | quux 1/1
1 |      2 | quux 1/2
2 |      3 | quux 2/1
2 |      4 | quux 2/2
(4 rows)

我希望生成的bar_ids是满足(foo_id, bar_id)上唯一主键约束的最低值。

即,我希望结果是:

mud=> select * from foo;
foo_id | baz  
--------+------
1 | baz1
2 | baz2
(2 rows)
mud=> select * from foo_bar;
foo_id | bar_id |   quux   
--------+--------+----------
1 |      1 | quux 1/1
1 |      2 | quux 1/2
2 |     *1*| quux 2/1
2 |     *2*| quux 2/2
(4 rows)

我如何更改我的模式来实现这一点?

不要这么做。

主键唯一的要求是它们的值必须唯一。它们是内部标识符,不应在UI中或通过外部API或其他方式向用户公开。

如果你问这个问题,你可能想把它们暴露在某个地方,这是你设计中的一个大危险信号。

如果您真的需要显示自定义ID,那么您可以创建一个额外生成的列,该列可以使用前缀、后缀、短划线进行格式化,并采用您想要的任何序列或自定义逻辑。

相关内容

  • 没有找到相关文章

最新更新