【问题标题】:Postgre or mysql id column auto incrementPostgre 或 mysql id 列自动递增
【发布时间】:2018-12-15 08:01:10
【问题描述】:

我对 postgre 或 mysql 中的主键有疑问。

所以:

在 mongodb 中,id 不是整数,它们是一些唯一值,例如“507f191e810c19729de860ea”。当您想要同步来自多个 id 的记录时,这会有所帮助。他们永远不会匹配(或机会很小)。因此,我可以从一个数据库中获取一条记录并将其插入到我的数据库中,而不会在 id 主键约束中发生冲突。

所以我的问题是 Postgre SQL 或 MySQL 数据库中有类似的功能。

我知道我可以使用 php/nodejs/python 生成 id,但我更喜欢使用数据库本身自动和简单的东西。

我可以在数据库中创建我的过程/函数,但我避免这样做 - 我希望数据库自动处理这个(就像 mongodb 一样)。

这种方法有什么缺点吗?

【问题讨论】:

  • 您在寻找UUIDs吗?
  • dev.mysql.com/doc/refman/8.0/en/… 用于 mysql。但你不应该忽略 auto_increment。
  • 谢谢,我喜欢 UUIDS,但是当我插入时我应该通过 UUID() 函数,数据库是否可以自己生成 id,就像我在插入查询中不传递“id”一样它会自动生成?

标签: mysql postgresql unique primary-key ddl


【解决方案1】:

在 PostgreSQL 中,您可以生成 UUID。

首先,您需要确保已安装扩展程序:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

然后使用uuid_generate_v4 函数生成UUID。如果您不想每次都记住插入它,您可以将其定义为主键的默认值:

CREATE TABLE mytable (
  id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
  -- other columns as needed...
);

【讨论】:

  • 谢谢,我正在寻找。所以如果我是正确的:如果我查询“INSERT INTO BOOKS(title) VALUES('book1'); 如果我使用常规 BIGINT 执行此操作,它将设置 id=1(对于空表),在这种情况下它将自动生成 UUID ,对吗?谢谢
  • 在这种情况下,您将获得一个自动生成的 UUID。对于bigint,除非您明确指定其他默认值或值,否则您将获得null 的默认值。对于serial 列,您将按照您的建议获得默认的1
  • 因此它的工作方式与 id BIGINT AUTO_INCREMENT PRIMARY KEY 相同,但它会保存 UUIDS 而不是整数。最后一个问题:MySql 中是否存在这个功能?
  • @user2693928 MySQL 没有内置的 uuid 类型。从 MySQL 8.0 开始,有一些函数可以生成 UUID,但您必须将它们用作 varchars,或者自己将它们转换为 binarys。详情请参阅开发团队的this blogpost
  • 好的,谢谢,使用 UUIDS 代替 bigint 主键是否有缺点
【解决方案2】:

您可以按如下方式使用SERIAL

CREATE TABLE table_name(
    id SERIAL
);

这就像 SQL 中的自动增量。

【讨论】:

  • 我认为这是postgresql?
  • "SERIAL 是 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE 的别名。"所以如果是整数 2 数据库键会冲突,对吗?
  • @user2693928 是的,没错。 serial 是在表中生成唯一性的好方法,但不是跨表或数据库生成唯一性的好方法。
  • 实际上,“SERIAL”是“INTEGER”的别名,附加了一个序列。 “BIGSERIAL”将是一个带有序列的“BIGINT”。一个是4个字节,另一个消耗8个字节。
猜你喜欢
  • 2014-10-01
  • 2013-08-27
  • 1970-01-01
  • 2012-12-14
  • 2011-02-18
  • 2011-09-17
  • 2016-02-19
  • 2021-05-01
  • 2010-10-04
相关资源
最近更新 更多