在主键的上下文中实现INDEX字段并自动递增int

时间:2011-11-13 18:50:56

标签: mysql

我被提及我需要并自动递增id以跟踪唯一记录... ... ...基本上......指向自动递增int的PRIMARY KEY

我可以看到这一点,因为用户数据是可变的..更改...如果你给每一行ID,它可以作为一种更好地跟踪用户并且不占用太多空间的方法 - 4个字节。

我也听说INDEX字段用作加速搜索的方法..

如果我有一组用户属性说A1, A2, A3,并且我有一个主键P,定义为int I ... INDEX如何与此相关?我该如何正确实施?

列 -

int, varchar, varchar, varchar,....Primary Key, Index ?

I, A1, A2, A3..., P, ?

2 个答案:

答案 0 :(得分:1)

在MySQL中:

  • 主键是索引
  • AUTO_INCREMENT列必须是主键
  • KEY是INDEX的同义词

因此,在您的示例中I将被声明为

CREATE TABLE (
  I int NOT NULL AUTO_INCREMENT,
  ...
  PRIMARY KEY (I)
  ...

但是,这是一个“代理”密钥,因为它不是自然密钥(例如员工编号),所以你也有一个独特的索引(或密钥)

CREATE TABLE (    ...
  EmployeeNumber char(7) NOT NULL,
  ...
  UNIQUE KEY (EmployeeNumber)
  ...

根据在JOIN和WHERE中的使用,将在单个列或列组合上创建其他索引,但索引策略通常与为表选择主键分开。

答案 1 :(得分:0)

听起来你有1:M的关系,因为用户可以有很多属性。我建议使用外键将属性存储到用户表中的第二个表:

create table `user` (
  `id` int(11) unsigned not null auto_increment,
  `first_name` varchar(60) not null,
  primary key (`id`)
)engine=InnoDB default charset=utf8;

create table `user_attribute_link` (
  `id` int(11) unsigned not null auto_increment,
  `user_id` int(11) unsigned not null,
  `attribute_id` int(11) unsigned not null,      
  primary key (`id`),
  index (`user_id`, `attribute_id`),
  foreign key (`user_id`) references `user` (`id`) on delete cascade
  foreign key (`attribute_id`) references `user_attribute` (`id`) on delete cascade
 )engine=InnoDB default charset=utf8;

create table `user_attribute` (
    `id` int(11) unsigned not null auto_increment,
    `name` varchar(60) not null,
    primary key (`id`),
    unique key (`name`),
)engine=InnoDB default charset=utf8;

从用户表到user_attribute表的FK将确保从用户删除行,user_attribute中的任何子行也将被删除。唯一键也添加到属性表中,以确保您无法添加任何欺骗属性。

修改 使用支持M:M的第3个表更新了模式(通过1:M - M:1)。如果您需要向用户属性添加更多信息,这将允许更大的灵活性。