【问题标题】:MySQL relations with restrictionsMySQL 关系有限制
【发布时间】:2021-07-28 19:27:14
【问题描述】:

我有这个表结构和简单的关系:

以及表中的样本数据:

公司 公司名称是唯一的,不应重复:

+------------+---------------+
| Company_ID | Company_name  |
+------------+---------------+
| 1          | Company_name1 |
+------------+---------------+
| 2          | Company_name2 |
+------------+---------------+

位置 (位置应分配给特定的公司):

+-------------+------------+-------------------------+
| Location_ID | Company_ID | Location_name           |
+-------------+------------+-------------------------+
| 1           | 1          | Company1_Location_name1 |
+-------------+------------+-------------------------+
| 2           | 1          | Company1_Location_name2 |
+-------------+------------+-------------------------+
| 3           | 2          | Company2_Location_name1 |
+-------------+------------+-------------------------+
| 4           | 2          | Company2_Location_name2 |
+-------------+------------+-------------------------+

数据 表中的数据应取决于所选公司,位置应仅是公司中出现的位置:

+---------+-------------+------------+------------+------+
| Data_ID | Location_ID | Company_ID | data_value | date |
+---------+-------------+------------+------------+------+
| 1       | 1           | 1          | 5          | date |
+---------+-------------+------------+------------+------+
| 2       | 2           | 1          | 2          | date |
+---------+-------------+------------+------------+------+
| 3       | 3           | 2          | 3          | date |
+---------+-------------+------------+------------+------+
| 4       | 2           | 1          | 1          | date |
+---------+-------------+------------+------------+------+
| 5       | 4           | 2          | 6          | date |
+---------+-------------+------------+------------+------+
| 6       | 4           | 2          | 7          | date |
+---------+-------------+------------+------------+------+

应满足的主要依赖关系:

  • 公司名称应该是唯一的,并且应该阻止添加同一公司的尝试
  • 位置名称应分配给特定公司,但它们可能会重复,并且位置可能出现在多个公司中但具有不同的Location_ID
  • 向日期表添加值应取决于:
    1. 公司(我们选择为其增值的特定公司)
    2. 地点(地点必须取决于公司)

例如:
在为具有Company_ID = 1 的公司添加值时,我应该只能添加出现在该公司下的Location_ID
如果我想在Company_name1 表中为Company_name1 添加一个值,那么data 表中Location_ID 列的唯一可用值应该是:Company1_Location_name1Company1_Location_name2,我不能那里有另一家公司的价值(即Company2_Location_name1Company2_Location_name2

目前效果不佳:
data 表添加值时,我可以选择一家公司,但我有可用的位置,我可以添加没有意义的值 - 对于Company_name1,我可以从Company_name2 添加一个位置,但它应该被阻止.

我该如何解决这样的问题?添加一些负责特定配对的附加表?

【问题讨论】:

  • 是否可以有没有位置的数据?如果不是,则 location 表示公司,您应该从数据表中删除 Company_ID。此外,这听起来像是用户界面问题,而不是直接与 mysql 相关。
  • 您不能将此关系指定为自动约束,因为CHECK 约束中不允许子查询。你可以用触发器来做到这一点。
  • @JoelCoehoorn 一切正常,但关键是将值添加到表 data 的人尽可能简单,在这种情况下,只有位置名称可能会重复,然后我不知道该数据将添加到哪个公司
  • @Barmar 任何示例我如何在 mariadb 下做到这一点?

标签: mysql sql mariadb foreign-keys relationship


【解决方案1】:

取决于您使用的数据库。

一种更简单的方法是在表字段上创建一个唯一约束,这也将强制它进行更新并消除对触发器的需求。做吧:

MSSQL 示例:

ALTER TABLE [dbo].[Company]    
ADD CONSTRAINT [Company_name] UNIQUE NONCLUSTERED
(
    [CompanyID], [Company_name]
)

然后你就可以做生意了。您将无法添加 2 个具有相同名称的公司。 你可以在这里找到另一个例子:Trigger to prevent Insertion for duplicate data of two columns

这正是你要找的:)

@编辑 1

好的,如果你想要 MARIADB 的例子,我们就去吧:

创建唯一的 Contraint - 使用 CREATE TABLE 语句

在 MariaDB 中使用 CREATE TABLE 语句创建唯一约束的语法是:

CREATE TABLE table_name
(
  column1 datatype [ NULL | NOT NULL ],
  column2 datatype [ NULL | NOT NULL ],
  ...

  CONSTRAINT constraint_name UNIQUE (uc_col1, uc_col2, ... uc_col_n)
);

表名

您要创建的表的名称。

第 1 列、第 2 列

您希望在表中创建的列。

约束名称

唯一约束的名称。

uc_col1, uc_col2, ... uc_col_n

构成唯一约束的列。

在你的例子中:

CREATE TABLE Company
( Company_ID INT(11) PRIMARY KEY AUTO_INCREMENT,
  Company_name VARCHAR(250) NOT NULL,
  CONSTRAINT company_name_unique UNIQUE (Company_name)
);

在此示例中,我们在 Company 表上创建了一个名为 company_name_unique 的唯一约束。它仅包含一个字段 - Company_name 字段。

【讨论】:

  • 我不确定我是否完全理解这一点。请问可以在mariadb下举个例子吗?
  • 问题标记为 mariadb/mysql。为什么要给出 SQL-Server 答案?
  • 为 MariaDB 编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
相关资源
最近更新 更多