MySQL复合主键列 - 顺序不敏感

时间:2014-01-21 18:36:35

标签: mysql sql

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

E.g。

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

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

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

3 个答案:

答案 0 :(得分:0)

不,它与唯一性无关,它对于排序和访问时间非常重要

答案 1 :(得分:0)

索引中的排序很重要。作为对订单重要性的提醒,请考虑如果类型不兼容会发生什么 - 例如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

答案 2 :(得分:0)

哈哈,不!关键是属性的复合 请原谅我被逗乐,这只是你知道的价值 你的属性是不同的A:1!= 2和B:2!= 1.
想象一下表格中的行 A | B
1个| 2个
2个| 1

想象一下,例如字符串连接:“1:2”而“2:1” 显然这些字符串不相等 在内部,复合主键的表示将不那么简单,当然,可能基于散列函数,存储在临时存储区域中以便查找,分为
基于范围的页面。

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