微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有限制的 MySQL 关系

如何解决有限制的 MySQL 关系

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

Simple database

和表中的样本数据:

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

+------------+---------------+
| 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
如果我想在 dataCompany_name1 表中添加一个值,那么 Location_ID 表中 data 列的唯一可用值应该是:{{1} } 和 Company1_Location_name1 并且我不能从其他公司那里获得价值(即 Company1_Location_name2Company2_Location_name1

目前效果不佳:
在向 Company2_Location_name2 表中添加值时,我可以选择一家公司,但随后我有可用的位置,我可以添加没有意义的值 - 对于 data,我可以添加来自 {{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 的例子,我们去:

创建独特的约束 - 使用 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)
);

table_name

您要创建的表的名称。

column1、column2

您希望在表格中创建的列。

constraint_name

唯一约束的名称。

uc_col1,... 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 字段。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。