如何解决有限制的 MySQL 关系
我有这个表结构和简单的关系:
和表中的样本数据:
公司
公司名称是唯一的,不应重复:
+------------+---------------+
| 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
- 向日期表添加值应取决于:
- 公司(我们选择一家我们为其增值的特定公司)
- 位置(位置必须取决于公司)
例如:
为具有 Company_ID = 1
的公司添加值时,我应该只能添加发生在该公司下的 Location_ID
。
如果我想在 data
的 Company_name1
表中添加一个值,那么 Location_ID
表中 data
列的唯一可用值应该是:{{1} } 和 Company1_Location_name1
并且我不能从其他公司那里获得价值(即 Company1_Location_name2
和 Company2_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 举报,一经查实,本站将立刻删除。