总的来说,我对postgres和SQL很陌生。我来自NoSQL。更具体的mongodb。在mongodb中,每个文档都有一个由mongodb自动生成的唯一id。
postgres行是否自动具有唯一的id,还是必须自己生成它们?
发布于 2019-11-21 11:39:08
你需要为自己定义一个:
create table foo
(
id integer generated always as identity primary key,
.... other columns
);在关系数据库中,您必须自己定义主键,数据库不会对此作出假设。例如,多到多关系的链接表通常根本没有生成的PK:
create table many_to_many
(
one_id integer not null references table_one,
other_id integer not null references other_table,
primary key (one_id, other_id)
);发布于 2019-11-21 20:44:40
@YulePale,移动到具有不同规则的环境总是很好的of...tiring。他们声称这对你的大脑有好处,但是学习一种新的范式并不是一天的事。
我之所以这样做,是因为您一直在询问“在PostgreSQL中,如果数据相同,可以有不能唯一标识的行?”这是个不错的问题,但是把它看作是一个特性是很重要的。想想看,用平易近人的语言来说,你怎么区分事物是一样的呢?它们是无法区分的,这就是相同的含义。
关系数据库中的全部要点是不要有相同的行。假设您有两个完全相同的文档,并将它们存储在两行中。他们在什么方面不同?他们身上没有什么不同的。那你为什么有两排?如果有更多的信息来区分它们,那么行中也可能会有这样的信息。也许它们来自不同的来源,所以您可以在每个文档中存储一条路径。
找出数据中的,唯一地标识每一行是表设计的起点。这可能是一个“天然”领域,但这是相当罕见的。可能是字段的组合。
为了方便起见,通常会生成ID (序列号或UUID)。但是,将一个唯一的数字插入相同的行是一个糟糕的计划。
1 Don Perkins 123 Main St Waltham MA
2 Don Perkins 123 Main St Waltham MA前面的ID使得行是唯一的,但数据并不是唯一的。假装那个地址只有一个丹·珀金斯。你现在有了糟糕的数据。这种事总是以眼泪结束。
蒙古模式和关系数据库的设计是不同的。您将帮助自己尝试并掌握关系设计。然后,您可以真正利用Postgres这样的工具的功能。外键、JOIN和CHECK约束可能是您的朋友。
我不知道您会在哪里找到它们,但是在过渡期间,与从Mongo迁移到RDBMS的人联系可能会很有帮助。我不认识蒙戈,但是有很多人同时认识蒙戈和波斯特格雷斯。事实上,一个重要的Postgres贡献者也支持一个你可能感兴趣的工具?
我刚刚查了一下,听起来好像MongoDB为行ID生成了一个基-12半随机数:
https://docs.mongodb.com/manual/reference/method/ObjectId/
如果您喜欢这样的东西,在Postgres中最好的选择是一个16字节的UUID。请注意,没有时间戳数据可从V4 UUID恢复。如果您需要时间戳,您也应该为它们添加一个列。
在创建记录时,这两列都可以设置为自动生成值,就在表的定义中。你已经有了一堆样本的答案。
发布于 2019-11-21 11:41:00
每个数据库都有每个行的唯一标识符。例如,对于其他列上的索引,需要这样的标识符,以便可以引用它们。
Postgres实际上有各种各样的内部ids。这里是他们的参考页面。
尽管如此,我认为您的问题是Postgres是否会自动提供这样的id供用户使用。让我用“否”来回答这个问题,尽管您可以访问一些ids。
但是,为任何需要的表创建一个非常简单。以下是两种常见的方法:
table_id serial primary key
table_id int generated always as identity primary keyhttps://stackoverflow.com/questions/58974078
复制相似问题