【问题标题】:MYSQL: Two fields as PRIMARY KEYs + 1 Field as UNIQUE, a questionMYSQL:两个字段作为PRIMARY KEYs + 1个字段作为UNIQUE,一个问题
【发布时间】:2011-09-23 13:40:15
【问题描述】:

我有两个主要(复合)键,它们分别指向一家商店和一家分店。 我想我应该为每一行使用一个对应的 ID,所以我添加了一个名为 ID 的 UNIQUE + AUTO_INCREMENT。

所以我在表上有一个名为 ID (AUTO INCREMENT) 的列,但它被声明为 PRIMARY - 这是自动完成的,我不希望 ID 是 PRIMARY。只有商店和分店。

我已经学会了如何欺骗 MYSQL 将 ID 字段接受为 UNIQUE 和 AUTO INCREMENT,因为制作 AUTO_INCREMENT 并不是非常简单(它想将其设为 PRIMARY)。 我必须删除 ID 字段(由于某种原因它不允许我删除它的 PRIMARY 索引),然后将其声明为 INDEX,然后才使用 AUTO INCREMENT。

这是一个好方法吗? 这个设计有什么我做错了吗?

谢谢!!!

【问题讨论】:

  • 拥有不是主键的自动增量 ID 有什么意义?主键越短越好,在 InnoDB 中使用自增作为主键有优势

标签: mysql database-design indexing unique auto-increment


【解决方案1】:

普遍的看法是每个表都应该有一个名为 Id 的唯一自动编号列。

在 Codd 和 Date 开发的经典数据建模中,ID 字段对于数据的完整逻辑模型不是必需的。

ID 字段对您有什么好处?您是否曾通过 ID 引用此表中的一行?如果从来没有,那么就离开这个领域。 (商店,分店)提供了一个非常好的PK候选人。

【讨论】:

  • 谢谢!!我想我会继续下去
  • dough... :) 我想我会继续做两张桌子。一个是公司表,另一个是分支机构表,其中参考将是从分支机构到公司的。在分支中,我将创建一个唯一的第三个密钥,它是 business_id,并且我将在整个方案中工作。这听起来足够合理吗?
【解决方案2】:

您的create table 声明是什么样的?因为我是这样想象的:

CREATE TABLE foo (
    IDCol int not null auto_increment,
    shop int not null,
    branch int not null,

    /* ... */

    UNIQUE KEY IDCol (IDCol),
    PRIMARY KEY (shop, branch)
);

【讨论】:

  • 我不得不说我为此使用了 phpMyAdmin,但我没有记录。
  • 当我执行我之前对所有其他表的意思的步骤时,似乎没有问题,即。 ERASE ID,重新添加,声明为UNIQUE,然后才AUTO INCREMENT
  • 您似乎在欺骗 phpMyAdmin 做您想做的事,而不是 MySQL。除了手动写出CREATE 查询之外,我不知道任何 phpMyAdmin 技巧可以让它做你想做的事。祝你好运。
猜你喜欢
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-13
  • 2018-08-07
  • 2013-09-12
  • 2011-08-30
相关资源
最近更新 更多