繁体   English   中英

MySQL复合主键列顺序不敏感

[英]MySQL Compound Primary Key Column-Order-Insensitivity

对于MySQL中的复合键,列的顺序对于确保行的唯一性重要吗?

例如

CREATE TABLE test (
    A  INT NOT NULL,
    B  INT NOT NULL,
    PRIMARY KEY (A, B)
);

现在,假设我已经有一行包含值A = 1,B = 2,MySQL会拒绝插入A = 2,B = 1的行吗?

我问这个问题是因为我需要一个使用复合键并忽略值顺序的解决方案。

不,唯一性无关紧要,仅对排序和访问时间很重要

索引中的顺序很重要。 为了提醒您顺序为何重要,请考虑如果类型不兼容(例如datevarchar(255)会发生什么。 这些值不可互换。

如果您希望两个值都唯一,那么您将需要添加一个触发器。 触发器可以实现更简单的条件,这是A小于B的要求。 结合主键,可以保证两个值的唯一性。 您可以在MySQL中表达此约束:

CONSTRAINT CHECK (A < B)

但是,可惜,MySQL将解析代码,但不执行检查。 相反,您可以在更新之前和插入触发器之前添加,以将最小值放入A 这是一个例子:

CREATE TRIGGER table_beforeinsert BEFORE INSERT ON table
     FOR EACH ROW 
     BEGIN
         declare xx int;
         if (NEW.A > NEW.B) then
             set xx := NEW.A;
             set NEW.A = NEW.B;
             set NEW.B = xx;
         endif;
     END

哈哈不! 关键是属性的组合。
不好意思,只是您知道...的价值
您的属性是不同的A:1!= 2和B:2!= 1。
想象一下表中的行。
A | B
1 | 2
2 | 1

想象一下,例如字符串并置:“ 1:2”而“ 2:1”。
显然,这些字符串不相等。
在内部,复合主键的表示将变得不那么琐碎,当然,
适当地基于哈希函数,存储在临时存储区中以进行查找
分为
基于范围的页面。

因此,重要的不是键中属性的顺序,而是
相应的列。
实际上,确定哪些属性最适合用于化合物的过程
主键是一个非常有趣的键。
因此,您应该清楚地了解该过程,否则您可能会奇怪为什么会遇到
数据不一致。
以一个人的桌子为例:
名字,名字,生日,街道,城市,国家,州,邮编
实际上,这些属性都不满足唯一标识一个人的条件。
名称和名字都没有。
好吧,所以名字和名字,生日以及城市还不错,但是看看
伦敦有多少名叫彼得·史密斯的人居住(可能位于GB或
安大略省,金田市)。
确定候选键的过程实际上就是定义属性之间的功能依赖性的过程。
基本上,这个想法是:
如果我知道一个人的姓氏,我是否知道他的名字。
如果我知道一个人的姓氏和他的名字,我是否知道他住在哪个城市?
等等。
该函数依赖关系写为:
城市,国家/地区-> zip //含义:当我认识一个人时,我知道他的邮编。
(当然,反之亦然)未出现在依赖项列表右侧的属性必须是每个候选键的一部分。
如果其他每个属性都由该属性确定,则说明您完成了。 你有你的
复合主键。
如果不:
然后,找到最佳候选密钥的过程只是首先使用的步骤
由表中所有属性组成的键。
然后删除依赖的属性。 列出所有候选密钥并重复。
然后查看相似性(哪些候选关键字包含在其他候选关键字中,这称为简化)。
因此,您将获得表的最佳复合主键。
作为第一种情况的示例:
属性
A名,B名,C市,D州,E zip(国际)
E-> C //国际邮政编码的格式例如为GB-W11 2BQ
E-> D
因此,第一个候选人是:
A,B,E(因为它们没有出现在右侧)。
其他属性是否都取决于? 是的,只剩下C和D,它们取决于E
你完成了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM