我正在研究一个网页索引机器人并使用php和mysql。其中一个表将存储网页列表。我希望该表具有基于整数的id
列(以便我可以更快地将其连接到其他表,以便其他表可以引用它而不将完整的URL存储在列中),但我也想要url
列保持唯一。
这个问题出现的原因是,如果我的脚本读取一个包含250个链接的网页,我不确定将它们添加到网页表而不创建重复项的最佳方法。我可以循环找到我发现的250个链接并查询每个链接以确保它们不存在,然后插入那些 - 这需要至少250个查询。
但是,如果我可以让mysql强制执行url
作为唯一列,我可以简单地执行一个insert ignore
语句,包含所有链接。这将使现有记录在添加新记录时不会被复制。如果我有这种类型的表具有唯一/主要和自动递增的整数id列,我还可以指定url列是唯一的吗?
id (auto inc) url added
----------------------------------------------------------------------
1 http://site.com/page-a/ 2010-01-01 01:23:34
2 http://site.com/page-b/ 2010-01-01 01:23:34
3 http://site.com/page-c/ 2010-01-01 01:23:34
我想到的另一个选择是将url设置为唯一的主键,然后使用php / mysql语句手动递增id
列:
url (unique, primary) id added
-------------------------------------------------------------
http://site.com/page-a/ 1 2010-01-01 01:23:34
http://site.com/page-b/ 2 2010-01-01 01:23:34
http://site.com/page-c/ 3 2010-01-01 01:23:34
似乎这样可以让mysql强制执行一个唯一的url列(从而允许我的insert ignore
方法),并允许我加入一个整数。唯一奇怪的是必须依靠我的脚本来添加和增加id列,但如果没有更好的选择,我可能愿意这样做。
我的选择是什么?
答案 0 :(得分:1)
是的,您可以将url
列设为唯一。因此,一个大的INSERT IGNORE INTO ... (...) VALUES (...), (...), ...
将完成这项工作。
不让url
成为主要的!您的主键应该是id
auto_increment字段;只需在url
字段上创建唯一索引。
不要忘记INSERT IGNORE
是特定于MySQL的,所以如果您计划支持例如PostgreSQL,那么您的代码将无效。
答案 1 :(得分:1)
您可以拥有任意数量的UNIQUE
个索引,但只有一个PRIMARY
个(这就是为什么它被称为主要索引)。
MySQL中的自动增量仅适用于PRIMARY
个键。因此,您应该拥有id
列AUTO_INCREMENT
和PRIMARY
以及url
列UNIQUE
。 PRIMARY
也暗示UNIQUE
,因此您不需要也不应该在单个列上添加两者。