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 / 问题

问题[foreign-key](dba)

Martin Hope
Sidharth Bajpai
Asked: 2024-06-15 16:53:56 +0800 CST

主键只能被多个可以引用它的表中的另一个表的单个外键引用

  • 5

假设我有一个表 Account,其中包含要登录的用户的用户名和密码:-

account (
    account_id BIGINT PRIMARY KEY,
    username VARCHAR(30),
    password VARCHAR(30)
)

-- I have two more tables that stores their credentials in the above table:-

customer (
    delivery_address VARCHAR(100),
    account_id FOREIGN KEY,
    ..30 more customer columns
)

admin (
    sp_admin_code INT,
    account_id FOREIGN KEY,
    ..30 more admin columns
)

管理员不能是客户,并使用相同的用户名和密码以客户身份登录。

我的问题:-

  1. 这是实现这种关系的正确方法吗?如果不是,那是什么?

  2. 我是否需要在帐户表的主键中添加一些约束,以表示它的单个条目可以同时被客户表或管理表引用?

  3. 现在我们还知道,帐户中的条目只有在客户表或管理表中有条目时才会存在,反之亦然。那么我们是否需要或是否想要添加一些级联/约束,我们该怎么做,我们应该怎么做,或者我们是否应该这样做?对不起,我很困惑。

谢谢你!

foreign-key
  • 1 个回答
  • 27 Views
Martin Hope
ifiht
Asked: 2024-05-10 02:41:33 +0800 CST

SQLite3 CREATE TABLE 命令中的外键错误

  • 7

寻找对此的新视角,我正在 sqlite3 交互式中运行命令,但看不到问题。这是代码:

CREATE TABLE Personas(
    PersonID INTEGER NOT NULL PRIMARY KEY,
    FirstNameAtBirth    TEXT,
    LastNameAtBirth     TEXT,
    MidNameAtBirth      TEXT,
    discordID           TEXT,
    githubID            TEXT
);

^ 执行成功,

CREATE TABLE Conversations(
    ConvoID INTEGER NOT NULL PRIMARY KEY,
    FOREIGN KEY(PersonID) REFERENCES Personas(PersonID),
    BodyText            TEXT,
    Timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
    Reactions           TEXT
);

^ 失败,Error: in prepare, unknown column "PersonID" in foreign key definition (1)
我在一个活动数据库中,我PRAGMA foreign_keys=ON;在任何事务之前都设置过,知道问题出在哪里吗?

foreign-key
  • 1 个回答
  • 15 Views
Martin Hope
Thiago Guimarães
Asked: 2024-02-21 09:09:26 +0800 CST

我应该从用户表或客户表中存储什么外键?

  • 6

假设我有一个名为 的表users,其中包含电子邮件和密码等基本用户信息,并且我还有一个名为 的表clients。

客户端是一种用户类型,因此它将有一个字段来保存表中相应用户的 id users,类似于 的字段user_id。

现在假设有一些特定于客户端的表,然后需要存储客户端的 id,如下所示:

用户表:

ID 电子邮件
1 user1@email.com
2 user2@email.com

客户表:

ID 姓名 用户身份
1 用户1 1
2 用户2 2

课程表:

ID 姓名 客户ID
1 课程1 1
2 课程2 2

现在我真正不知道的是我应该在 Courses 表中保存什么 id 。

我应该保存client_id来自客户端表还是应该将用户表中的用户 ID 保存为客户端 ID。

我真的不知道,因为客户是一种用户类型,只有客户可以购买课程,而不是所有类型的用户,另一方面,没有用户就不存在客户,真正令人困惑的是,如果我使用用户 ID 而不是客户端 ID 那么该字段应该称为“user_id”?但这样的话它就会变得通用,因为只有客户才能上课程。

那么最好的方法是什么:

1 - 命名字段client_id并从客户表中添加客户的 id,然后获取与该客户相关的用户(我倾向于这个)。

2 - 命名字段client_id并存储用户表中的用户 ID,并获取关联的客户端(这有点令人困惑,但从层次结构上讲可能是有意义的,因为没有用户就没有客户端)。

3 - 命名字段user_id并存储用户表中的用户 ID(这种方法确实打破了我的观点,因为user_id可以是任何用户,但只有客户端类型的用户可以有课程)。

- - - - - - - - - - - - - - -更新 - - - - - - - - - - -----

所以我认为我的问题不清楚,所以我会澄清。

我想知道的是,是否有关于此主题的最佳实践,因为由于关系,我存储和检索数据的方式将直接影响我在应用程序中检索数据的方式。

现在,在真实的情况下,我有 3 个表: table users、 tableclients和 table courses。

该表clients仅包含不适合表的字段users,因为我将拥有更多类型的用户,这些用户也将在其他表中,就像administradors这也是一种用户类型。

现在,考虑到没有用户就不会存在客户,并且考虑到只有客户可以进行购买来购买课程,例如,我应该将哪个 id 存储在client_id表中courses,表中的 idclients或表中的 id users。

例如,只有客户可以购买产品,但客户(clients表)属于用户(users表)。在表中,假设purchased_products包含一个名为 的字段client_id,我应该从表中获取客户端的 idclients还是从表中获取用户的 id users?

两者对我来说都有意义,而且无论我真正想知道什么在这里更有意义,我都能够检索数据:

1 - 如果我将表中的 id 存储clients在 中courses.client_id,我会像这样检索用户:从$client->user层次结构上讲,这没有意义,因为用户位于客户端之前,而不是相反,但至少它是表的 idclient存储在courses.client_id.

2 - 如果我将表的 id 存储users在 中courses.client_id,我会以一种更有意义的方式检索数据,例如$user->client but I fell like the name of the field should not be course.client_id but rathercourse.user_id`,但这也会很糟糕,因为并非所有用户都可以购买课程,因此可能会产生误导。

在第一个示例中包含与该客户端的$client表clients和 $client->user users` 相关的所有信息。would access all information related to the table

在第二个示例中包含与该用户的$user表users和 $user->client客户端相关的所有信息。would access all information related to the table

同样,这更多的是一个语义问题,使事情更有条理。

foreign-key
  • 1 个回答
  • 51 Views
Martin Hope
Pedro Gómez
Asked: 2024-01-18 01:08:51 +0800 CST

表达用户与其直接经理之间关系的正确句子是什么:

  • 3

表达用户与其直接经理之间关系的正确句子是什么:

  1. 由于经理手下有多名员工,因此必须维护多对多表。
  2. 必须将引用类型的字段(外键)添加到用户表中,并引用其直接经理的记录。
  3. 不需要添加任何东西,因为经理也是员工,所以我们将使用继承机制。
  4. 这两个答案都不正确。

我认为第二个选项是正确的句子,因为它建议在用户表中使用类型引用(外键)的字段来建立用户与其经理之间的直接关系

foreign-key
  • 1 个回答
  • 34 Views
Martin Hope
Azzedine Bk
Asked: 2023-08-09 19:57:05 +0800 CST

删除父级而不删除子级

  • 5

我有三个表:产品、库存产品、已售产品。

产品和“库存产品”是不同的表,因为同一产品的不同批次库存有不同的序列号。以下是这些表中的重要行:

产品:

产品
ID
指定

库存产品:

库存产品
ID
数量
批次序列号

销售产品:

销售产品
ID
批次序列号
数量

SoldProducts 中的 BatchSerialNumber 引用 StockedProducts 中的同一列。

我的问题是,当库存批次用完时,我想删除它的记录,同时保留其销售的所有记录。

我如何使用外键来管理它?

foreign-key
  • 1 个回答
  • 13 Views
Martin Hope
Izzo
Asked: 2022-09-18 13:35:11 +0800 CST

如果实体的主键必须包含外键,这是否会使实体变弱?

  • 3

我目前正在学习 RDBMS 上下文中的强实体类型和弱实体类型。在阅读时,我遇到了这样的声明:

“弱实体依赖于强实体来确保其存在。与强实体不同,弱实体没有任何主键”

我开始掌握强实体类型和弱实体类型之间的区别,这种说法对我来说似乎不正确。具体来说,它指出弱实体没有主键。但是,不应该每个实体都拥有一个主键吗?即,必须有将提供唯一性的属性组合。所以说弱实体类型没有主键是没有意义的。

但是,弱实体类型的真正定义似乎是主键必须需要外键的实体。

我对弱实体的定义是否正确?

database-design foreign-key
  • 1 个回答
  • 80 Views
Martin Hope
Johannes Pille
Asked: 2022-09-17 03:44:33 +0800 CST

自引用记录,可能引用同一行,具有 uuid pkey 和非 null 和外键约束?

  • 2

设想

一个表包含代表一个链(或者,更准确地说,分别是任意数量的独立链)的记录。
除了引用链中的直接祖先之外,记录还应该引用插入的第一条记录,标记特定链的开始。

问题陈述

  • 该表只被插入,写入它的用户没有update权限
  • 理想情况下,包含对链的第一条记录的引用的列将是自引用外键以及 not null约束
  • 主键是 a ,因此访问序列 ( ) 的uuid潜在解决方案不适用latest_value()serial
create table chained_records (
   id uuid not null default gen_random_uuid(),
   -- in the case, where an inserted record *is* the first of a chain,
   -- this column would reference itself (i.e. the above `id` column) 
   first_in_chain_id uuid not null references chained_records(id),
   -- snip
);

问题

在现代 postgres (14) 中,可以这样做吗?
是否存在一种方法来插入一个新的不可变记录,该记录在单个insert语句中引用自身,同时保持所有约束到位?

postgresql foreign-key
  • 2 个回答
  • 169 Views
Martin Hope
loris
Asked: 2022-09-16 06:20:14 +0800 CST

如何更改外键中的引用?

  • 0

重命名一些表后,出现以下错误:

MariaDB [testdb]> INSERT INTO user_events (date, uid, operation, info) VALUES('2022-09-15','xyz','create',NULL);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails `testdb`.`user_events`, CONSTRAINT `user_events_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `associations` (`uid`))

原因是需要将里面的associations表REFERENCES改成users.

实现这一目标的最简单方法是什么?

foreign-key mariadb
  • 1 个回答
  • 33 Views
Martin Hope
JLCarveth
Asked: 2022-09-16 05:37:52 +0800 CST

检查是否存在外来关系

  • 0

我在 SQLite v3.37 中有几个表,用于跟踪Users、Roles和Permissions.

就这个问题而言,users只有一个id和一个email。rolesandpermissions也很简单,分别只有一个id和一个roleName和permName。

CREATE TABLE permissions (id integer primary key not null, permName text unique not null, dateCreated text default CURRENT_TIMESTAMP, dateUpdated text default CURRENT_TIMESTAMP);

我有两个辅助表,userRoles它们rolePerms分别跟踪为用户分配了哪些角色,以及分别为每个角色分配了哪些权限。

CREATE TABLE userRoles (userID integer not null, roleID integer not null, FOREIGN KEY (userID) REFERENCES users(rowid), FOREIGN KEY (roleID) REFERENCES roles(id));

这是架构的粗略图:

数据库架构图

我正在尝试从电子邮件地址和 a 创建一个 SQL 查询permName,确定该用户是否已被授予具有该权限的角色。

我试过写一个这样的查询:

SELECT users.rowid, users.email, roles.rowid, roles.roleName, permissions.rowid, permissions.permName, userRoles.*, rolePerms.* FROM users
    INNER JOIN userRoles on userRoles.userID=users.rowid AND userRoles.roleID=roles.roleID 
    INNER JOIN rolePerms on rolePerms.roleID=roles.rowid 
    WHERE users.email = 'doug@gmail.ca' AND permName='testPermission';

但是这个查询显然没有完成工作。我见过这个关于加入 4 个表的问题,但是这些表都与一个表相关,而不是像我使用的模式那样的两个表。

编辑:我相信以下查询有效:

SELECT DISTINCT(permName) FROM users INNER JOIN userRoles ON userRoles.userID=users.rowID INNER JOIN roles ON userRoles.roleID=roles.id INNER JOIN rolePerms ON rolePerms.roleID=roles.id INNER JOIN permissions ON permissions.id=rolePerms.permID WHERE users.email='doug@gmail.ca';

最大的变化是roles通过 JOIN ON引用userRoles,否则 SQL 查询不知道表(?)

sqlite foreign-key
  • 1 个回答
  • 22 Views
Martin Hope
JosueMagnus12
Asked: 2022-08-05 09:35:26 +0800 CST

多对多关系中的 2 个外键

  • 1

数据库专家您好!

我正在设计一个小型数据库并遇到这样的情况,即两个外键在同一个表中,根据不同的操作引用父表中的不同行。让我解释。

最典型的N:M关系示例是学生注册课程、产品被标记、租户租用公寓等。但所有这些都只描述了一个动作(注册、标记、租用等),所以当两个不同的动作被执行时会发生什么同一个子表?例如,正在发送和接收的消息。

假设我们有两个表,users并且messages我们有以下业务逻辑:

一个用户可以发送和接收多条消息。

一条消息由用户发送并由另一用户接收。

因此,该message表将有 2 个外键,sender_id并且 receiver_id,两个用户。

这是我感到困惑的地方。我们可以创建一个带有外键的连接表,user_id但message_id用户 X 发送的消息和用户 Y 接收的消息将全部保存在同一个表中,我不知道这是否正确(不是焦点表)。

messages我们应该在表中保留两个外键吗?

我在发布这个问题之前进行了搜索,我有两个链接

在这里人们说我们应该为N:M关系创建连接表,但同样是执行一个操作的示例。

在这里,人们似乎对子表的两个外键的想法很满意。

设计这样的关系的正确方法是什么?

database-design foreign-key
  • 1 个回答
  • 48 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