AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题

问题[primary-key](dba)

Martin Hope
Lund
Asked: 2025-01-24 10:21:16 +0800 CST

我应该让用户输入主键吗?

  • 5

我有一个产品表,有两个选项:

  1. 让用户输入 PK,因为有些用户可以输入条形码或不输入(在这种情况下,应用程序将允许用户自由输入任何内容,例如他自己的代码约定,如奥利奥冰淇淋 IC-O)显然,我需要添加一些验证以避免 PK 包含数千个字符等等。

  2. 使用自动增量 PK 并为“SecondaryCode”创建另一个字段,但对于用户来说,这将是主键,这里也对 SecondaryCode 进行一些验证,并且使用像 PK 这样的 SecondaryCode 感觉很奇怪。

有什么非常糟糕的理由不选择第一个选项吗?理论上是好的,而且更容易管理,但我不太愿意将一些重要的东西暴露为主键。也许我忽略了一些显而易见的东西。

primary-key
  • 1 个回答
  • 35 Views
Martin Hope
Stonecraft
Asked: 2022-07-25 10:43:14 +0800 CST

如何使用自然键和代理键获得“两全其美”?DBMS 会更好吗?

  • 2

我正在设计我的第一个数据库,我发现自己对在为分类变量的每个实例存储整数或字符串之间进行选择感到沮丧。

我的理解是,如果我有一个包含城市的表,我想将其作为国家表的子项,那么最有效的方法是将国家表的 PK 作为城市表中的 FK。但是,为了便于使用和调试,最好始终将字符串名称与国家/地区 PK 相关联。我考虑过的每个解决方案要么不被推荐,要么看起来过于复杂。

我想就这些方法的优点发表意见(或了解新方法),并了解是否必须采用这种方式,或者数据库是否只是因为传统而采用这种方式。

可能的方法:

  1. 使用字符串作为国家/地区的 PK。然后我将在任何子表中为它提供一个人类可读的 FK。显然性能不如使用整数,但我怀疑这可能是获得我想要的便利的最不坏的方式。

  2. 使用将每个国家/地区的字符串名称连接到 states 表的应用程序逻辑创建一个视图。

  • 我不喜欢这个,因为如果应用程序逻辑中断,表格的可读性就会降低。此外,我希望大型连接操作比字符串 PK/FK 的性能损失更严重。
  1. 创建一个单独的表以将数字 ID 与适当的字符串 ID 连接起来。我不确定是否最好有一个表来编码每种类型的关系,或者一个大表有一个大的 ID 池,涵盖所有整数键-字符串值关系。然后,我可以使用应用程序逻辑来查找适当的字符串,并在用户给出字符串名称时将适当的 PK 填充到子表中。
  • 我觉得这也可能非常耗费资源,因为每次向子项添加新行时都必须进行查找。这也意味着我仍然必须创建我想要的视图。
  1. 使用enum数据类型。本能地,这将是我的首选方法,因为它似乎是自然键和合成键之间的理想平衡:使用整数 ID 并给 ID 一个字符串标签,这样字符串本身就不需要重复。
  • 不幸的是,我的研究发现不建议这样做。原因之一是类别不能轻易删除。我不确定这对我来说是否会破坏交易,但我也想知道为什么 DBMS 是这样设计的。分类变量是否常用到足以为它们添加便利功能?
foreign-key primary-key
  • 1 个回答
  • 506 Views
Martin Hope
Swayam Shah
Asked: 2022-01-22 17:35:16 +0800 CST

为什么我们有主键时需要唯一键?

  • 1

我试图用谷歌搜索这个问题,但我发现的只是主键和唯一键之间的区别,当我们有一个可以识别任何单个记录的主键时,为什么我们实际上需要一个唯一键,有人可以提供一个例子来解释这一点或提供一个解释这一点的链接。

mysql primary-key
  • 1 个回答
  • 488 Views
Martin Hope
Alex Parker
Asked: 2022-01-07 11:36:29 +0800 CST

如何从三个表中创建主复合键?

  • 0

假设我有带有 A.id 的 tableA,带有 B.id 的 tableB 和带有 C.id 的 table C。现在我想创建一个具有主复合键(A.id,B.id,C.id)的表 D。我怎样才能做到这一点?

create tableD(

    A.id ..
    B.id ..,
    C.id ..,
    
    primary key (A.id, B.id, C.id),
    foreign key (A.id, B.id, C.id) references ??
)
foreign-key primary-key
  • 1 个回答
  • 271 Views
Martin Hope
Abd al rahman shebani
Asked: 2021-12-25 04:29:27 +0800 CST

在一对一关系中具有与父表相同的主键

  • 2

将两张表建立为一对一的关系,我想考虑哪一张是更好的设计?父表(人)的主键与子表(配置文件)的主键相同,还是为配置文件表构建另一个主键?

我认为在连接两个表时,具有相同的表主键是更好的选择,因为主键将是配置文件表上的聚集索引,因此它不会扫描整个表以获得匹配

关系数据图

表创建语句

sql-server primary-key
  • 1 个回答
  • 371 Views
Martin Hope
Dolphin
Asked: 2021-09-30 18:55:38 +0800 CST

如何将序列号添加到表中?

  • 0

我有一个表有超过 1000000 行是从 CSV 文件导入的。该表没有主键,我想在表中添加一个具有递增 bigint 的主键。这是我的表 DDL:

CREATE TABLE public.ecdict (
    word varchar(256) NULL,
    phonetic varchar(512) NULL,
    definition varchar(80000) NULL,
    "translation" varchar(80000) NULL,
    pos varchar(100) NULL,
    collins int4 NULL,
    oxford int4 NULL,
    tag varchar(128) NULL,
    bnc int4 NULL,
    frq int4 NULL,
    exchange varchar(128) NULL,
    detail varchar(2000) NULL,
    audio varchar(8) NULL,
    id int8 NULL
);

该id列是新添加的,所有数据都为 NULL,我尝试使用此命令:

update ecdict c
set id = c2.seqnum
from (
   select c2.*, row_number() over () as seqnum
   from ecdict c2
) c2
where c2.pkid = c.pkid;

但是我找不到用于连接的表的唯一列,我应该怎么做才能添加id具有递增bigint值的列?

postgresql primary-key
  • 1 个回答
  • 787 Views
Martin Hope
bluenote10
Asked: 2021-05-19 02:24:35 +0800 CST

如何在 Postgres 的主键上处理 UPDATE 中的重复项?

  • 3

让我们假设一个场景,其中包含实体Person和Company一个表格,该表格PersonCompanyStocks模拟了一个人拥有某家公司的股票数量(N:M 基数)。例如:

person | company | num_stocks
-----------------------------
Alice  | foo     | 300
Bob    | foo     | 100
Bob    | bar     | 200

该表用(person, company)作主键来保证唯一的条目,以及各个个人/公司表的外键(为简单起见,我只使用字符串 ID)。

现在让我们假设 companybar收购 company foo。我们希望以如下方式更新表:

person | company | num_stocks
-----------------------------
Alice  | bar     | 300
Bob    | bar     | 300

仅查看Alice's 记录建议使用天真的方法,例如:

UPDATE
  PersonCompanyStocks
SET
  company = "bar"
WHERE
  company = "foo"

但是,此更新失败,duplicate key value violates unique constraint ...因为Bob已经有一行带有 key ("Bob", "bar")。ForINSERT的 Postgres 支持ON CONFLICT DO ...,但似乎没有对应的 for UPDATE。显然,我们还必须处理正确合并num_stock两行的值。

解决这个问题的最佳策略是什么?我只看到一个相对难看的解决方案:

  • 一个查询来确定重复项。
  • 一个UPDATE将重复项合并到最后一行。
  • 一个DELETE删除有问题的重复项。
  • 以上UPDATE是在没有重复的行中进行重命名。

这感觉很复杂,并且可能容易出现竞争条件。Postgres 是否提供任何技巧来更优雅地解决这个问题?

postgresql primary-key
  • 2 个回答
  • 2092 Views
Martin Hope
analogbeing
Asked: 2021-05-06 21:33:36 +0800 CST

当一个已经存在mysql8时如何更改列以使其成为主键?

  • 0
 id         | bigint unsigned | NO   | PRI | NULL    | auto_increment |
 | title      | varchar(255)    | NO   |     | NULL    |                |
 | category   | varchar(255)    | NO   |     | NULL    |                |
 | summary    | varchar(10000)  | NO   |     | NULL    |                |
 | detail     | mediumtext      | NO   |     | NULL    |                |
 | created_at | timestamp       | YES  |     | NULL    |                |   
 | updated_at | timestamp       | YES  |     | NULL    |                |
 | image      | mediumblob      | YES  |     | NULL    |                |
 | image1     | mediumblob      | YES  |     | NULL    |                |
 | image3     | mediumblob      | YES  |     | NULL    |                |
 | phold      | varchar(50)     | NO   |     | NULL    |                |
 +------------+-----------------+------+-----+---------+----------------+

我现在有这个数据库,我想与另一个表建立一对一的关系,我使用列( title )来链接特定数据。当我跑

mysql> alter table tours add primary key (id,title);

或者

mysql> alter table tours add constraint pk_tours primary key (id, title);

错误:

ERROR 1068 (42000): Multiple primary key defined

在这两个查询上。

我想要另一个名为 itinery 的表,我用它与前一个表在 volumn title 的帮助下链接;

我正在使用 mysql 8 和 laravel 8。谢谢

mysql primary-key
  • 1 个回答
  • 187 Views
Martin Hope
luisepa1420
Asked: 2020-12-10 19:06:48 +0800 CST

简单主键与复合主键的优缺点

  • -1

我正在尝试为数据库建模。对于问题的一部分,我有一个实体区域,其中包含部门,并且每个部门都分配了特定的功能。我有以下。

我想了两种处理关系的方法。第一种是为 Department 表创建一个自增键,假设部门名称可以在不同区域重复。我对 Function 表执行相同操作,将可递增键作为标识符,并为组合(Department_ID、Name)创建一个唯一键。

第二种方式是把字段组合(Department_ID, Name)作为Department的主复合键,Function表也一样,把字段(Department_ID, Name)作为复合主键。

与第一种情况一样,使用简单键而不是复合键有哪些优点或缺点,它如何影响唯一键的使用?这是正确的方法吗?

急诊室

database-design primary-key
  • 3 个回答
  • 636 Views
Martin Hope
User1974
Asked: 2020-12-04 13:17:29 +0800 CST

在没有PK的表上通过dblink创建快速刷新MV?

  • 0

我想通过 dblink 在主系统(Oracle 18c)和外部系统(Oracle 19c)之间创建一个物化视图。

  • MV 将按 30 秒的计划刷新(因为通过 dblink 无法进行 on-commit)。
  • 外部系统中的表没有主键。

我是新手。这是我尝试过的:

--in the external system:  
create materialized view log on external_system.workorder with rowid;  


--in the primary system:
create materialized view primary_system.workorder_mv
build immediate 
refresh fast 
start with sysdate next sysdate + (30/(60*60*24))
as
select
    cast(workorderid as number(38,0)) as objectid,
    wonum,
    status,
    --other fields
    longitudex,
    latitudey
from
    external_system.workorder@gistomax

当我尝试上述方法时,我收到一连串错误,从一个说我需要主键的错误开始。

我发现一个页面表明可以通过 dblink 进行快速刷新。但该示例使用主键,而不是 rowid。

文档说:

在主表重组后,在执行完全刷新之前,Rowid 物化视图不符合快速刷新的条件。

但我真的不知道那是什么意思。老实说,我对此很陌生,我知道我找错了树,所以我会停在那里。


问题:

是否可以通过没有 PK 的表上的 dblink 创建快速刷新 MV?

oracle primary-key
  • 1 个回答
  • 710 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve