Php MySQL:what';索引、唯一、外键和主键之间的区别是什么?

Php MySQL:what';索引、唯一、外键和主键之间的区别是什么?,php,mysql,sql,codeigniter,Php,Mysql,Sql,Codeigniter,好的,我是SQL的新手 我正在设置我的表,我对索引、键、外键感到困惑 我有一个用户表和一个项目表 我想使用用户(id)将项目附加到用户 这就是我到目前为止所做的: 删除表(如果存在项目); 创建表项目( id int(8)无符号非空, 用户id int(8), 名称varchar(120)不为空, 描述varchar(300), 于年月日创建, 更新日期为, 主键(id), 关键用户id(用户id) )引擎=InnoDB; 更改表项目( 添加约束用户\u项目, 外键(用户id)引用用户(id),

好的,我是SQL的新手

我正在设置我的表,我对索引、键、外键感到困惑

我有一个用户表和一个项目表

我想使用用户(id)将项目附加到用户

这就是我到目前为止所做的:

删除表(如果存在项目);
创建表项目(
id int(8)无符号非空,
用户id int(8),
名称varchar(120)不为空,
描述varchar(300),
于年月日创建,
更新日期为,
主键(id),
关键用户id(用户id)
)引擎=InnoDB;
更改表项目(
添加约束用户\u项目,
外键(用户id)引用用户(id),
关于删除级联
)
因此,我迷茫的是一个键、一个索引、一个约束和一个外键之间的区别是什么?

我一直在网上找,找不到新手对此的解释

另外,我正在使用phpactiverecord,并在模型中设置了关系

用户->拥有多个(“项目”)

项目->属于(“用户”)

我不确定这是否有什么关系,但我想我会把它扔进去

谢谢

编辑:

我认为这可能与Navicat有关,所以我进入了WampServer->phpMyAdmin并运行了这个

删除表(如果存在项目);
创建表项目(
id int(8)无符号非空,
用户id int(8)不为空,
名称varchar(120)不为空,
描述varchar(300),
于年月日创建,
更新日期为,
主键(id),
关键用户id(用户id),
外键(用户id)引用用户(id)
)引擎=InnoDB;

还是没什么…:(

键只是索引的另一个词

唯一索引意味着该索引中的所有值都必须是唯一的,并且与该索引中的其他值不同。例如,表中的Id列

主键是一个唯一的索引,其中所有键列必须定义为非空,即必须设置索引中的所有值。理想情况下,每个表应该(并且可以)只有一个主键

外键是两个表之间的引用约束。此列/索引的类型和长度必须与引用表中的引用列相同。外键的一个示例是用户登录表和用户表之间的用户ID。请注意,它通常指向引用表中的主键

http://dev.mysql.com/doc/refman/5.1/en/create-table.html

扩展Shamil的答案:

索引类似于书后面的索引。它为该列中的数据提供了一个简化的查找,因此搜索速度更快。有趣的细节:MyISAM使用一个哈希表来存储索引,索引对数据进行键控,但深度仍然与表大小成线性比例。InnoDB使用索引>B-树的索引结构。B-树类似于嵌套集-它将数据分解为逻辑子组,这意味着搜索深度要小得多。因此,InnoDB中按范围查找的速度更快,而MyISAM中单个键的查找速度更快(请记住哈希表和二叉树的大O)

唯一索引是一个索引,其中数据库中的每一行必须为该列或列组具有唯一值。这对于防止重复非常有用,例如,对于用户表中的电子邮件列,每个电子邮件地址只需要一个帐户。重要注意,在MySQL中,重复键UPDA上的
插入TE
语句将在发现重复的唯一索引匹配时执行更新,即使它不是您的主键。这是在具有unique的表上使用
INSERT…update
语句时要注意的一个陷阱。您可能会无意中覆盖记录!关于MySQL中的unique的另一个注意事项-根据ANSI-92标准,空值不被认为是唯一的,这意味着您可以在一个可为空的唯一索引列中有多个空值。虽然这是一个标准,但其他一些RDBMS在实现上有所不同

主键是一个唯一的索引,它是表中任何给定行的标识符。因此,它不能为空,并保存为一个聚集索引。聚集意味着数据将按主键的升序写入文件系统。这将对主键进行搜索比任何其他索引类型都快得多(与MySQL一样,只有PK可能是聚集索引)。请注意,如果您的数据不是自动递增的,那么集群也会引起INSERT语句的问题,因为如果您插入一个具有较低序数值的PK的新行,MySQL将不得不在文件系统上移动数据。这可能会影响您的DB性能。因此,除非您确定自己知道要做什么,否则始终使用自动递增MySQL中PK的d值


外键是对另一个表中列的引用。它强制引用完整性,这意味着如果被引用表中不存在输入值,则无法在具有另一个表外键的列中创建条目。在MySQL中,外键不会提高搜索性能。它还需要密钥定义中的两个表都使用InnoDB引擎,并且具有相同的数据类型、字符集和排序规则。

您是否从框架中收到任何错误消息?老实说,如果您是MySQL新手,除非您知道为什么要使用InnoDB,否则不应该使用InnoDB…默认情况下使用MyISAM,直到您对存储engines@Prof83它说您只能对INNODB使用外键。@Prof83-不,MyIsam不支持FKs-它只会在您定义FK的列上创建索引。只有INNODB支持FKs。@JakeCha