Php URL唯一的列

Php URL唯一的列,php,mysql,phpmyadmin,Php,Mysql,Phpmyadmin,我有一个MySQL数据库,其中有一个带有网站地址的表。网站的访问者可以发送我添加到网站的链接 为了防止链接到同一个页面,我想使带有URL的列唯一。我该怎么做 我发现了下面这样的东西,但是有没有办法在phpmyadmin中设置它 INSERT INTO `table` (value1, value2) SELECT 'stuff for value1', 'stuff for value2' FROM `table` WHERE NOT EXISTS (SELECT * FROM `table

我有一个MySQL数据库,其中有一个带有网站地址的表。网站的访问者可以发送我添加到网站的链接

为了防止链接到同一个页面,我想使带有URL的列唯一。我该怎么做

我发现了下面这样的东西,但是有没有办法在phpmyadmin中设置它

INSERT INTO `table` (value1, value2) 
SELECT 'stuff for value1', 'stuff for value2' FROM `table` 
WHERE NOT EXISTS (SELECT * FROM `table` 
WHERE value1='stuff for value1' AND value2='stuff for value2') 
LIMIT 1 

在phpMyAdmin环境中执行SQL代码时,应该能够使列唯一:

ALTER TABLE  `table` ADD UNIQUE ( `uniqueColumn`, `anotherUniqueColumn` )

然后,当您尝试向该列插入数据时,如果该列不是唯一的,则会出现错误。

当然,您可以在PHPmyAdmin中创建唯一的列,不仅可以通过编写SQL,还可以通过使用图形界面,这更容易。此外,您还可以编写自己的脚本来检查该值是否已插入表中。您只需使用一个函数,该函数与循环一起获取行的值,并将检索到的值与用户尝试提交的值进行比较。至少在一个小型数据库中,它运行得很好。

正如Dan Farrell在一篇评论中提到的,您的问题缺乏精确性:如果您向我们提供了您正在使用的模式(列是什么?),它会更加清晰

此外,正如Daniel在他的回答中提到的,如果您想拥有一个唯一的列或列的唯一组合,您应该首先使用
unique
索引

话虽如此,依靠MySQL报告错误进行业务决策是不完全正确的,也不需要这样做。事实上,MySQL提供了两个命令,可以让您决定在插入违反唯一索引时应该做什么,并且应该使用它,而不是让MySQL抛出错误。你可以参考更多

  • INSERT IGNORE INTO…
    :使用此语法,只有在不违反唯一键的情况下,MySQL才会插入行,即在您的情况下,如果URL不在表中。你会得到这样的结果

    INSERT IGNORE INTO `yourtable` (field1, field2, ..., url)
    VALUES ('f1', 'f2', ..., 'http://example.com');
    
    在执行查询时,MySQL将告诉您有多少行受到影响,因此如果url已经存在,它将告诉您没有任何行受到影响

  • 插入到。。。关于重复密钥更新…
    :使用此语法,如果url已经存在,您将能够更新条目而不是插入新条目;例如,如果您有一个计数器字段存储用户提交url的次数,则此字段非常有用

    INSERT INTO `yourtable` (last_submitted_by, counter, url)
    VALUES ('joe', 1, 'http://example.com')
    ON DUPLICATE KEY UPDATE
      counter = counter + 1,
      last_submitted_by = VALUES(last_submitted_by) ;
    
    请注意,在
    更新
    部分中,您可以使用
    值(..)
    构造引用在
    插入
    部分中指定的值(在我的示例中,这将用于维护对提交此url的最后一个用户的引用)

  • 更新(在对其他答案发表评论后)


    当然,索引中可以使用的字段大小是有限制的,对于文本字段,必须指定长度。提供了有关限制的详细信息,但即使有下限(MySQL为1000字节),这对于URL的唯一性来说已经足够了(如果以unicode格式存储,这将是500个字符,但您确实没有理由对url执行此操作,尽管现在您可能会遇到一些特殊字符,因为在域名中可以使用非ascii字符(在域名之外,非ascii字符应为url编码).

    有几种解决此类问题的方法,但我最喜欢的是使用校验和。以下是一个示例(为了效率起见,使用存储为二进制数据的高位校验和):


    您可以使用校验和插入URL,或者增加重复计数。当然,如果不更改架构和插入查询(这可能是不需要的),这是无法完成的。但它具有处理任意长度URL的明显优势。

    我将columntype从TEXT更改为长度为200的VARCHAR。在至少,我可以将其设置为唯一。

    “stuff for value1”不正确,应该是“
    stuff for value1
    ”你需要在列中使用反勾号。你说的是保存链接,但你的示例有两个值。如果
    value1
    是URL,那么
    value2
    是什么,这是如何进入你的问题的?这是一个示例代码。我已经给出了该表中有12列,只有url列必须是唯一的。好吧,columntype是text,所以它给了我一个errormessage-#1170-BLOB/text列“url”,在键规范中使用,没有键长度-是的,mysql在一列中只能存储这么多字节的文本。这就是为什么存在校验和!(好吧,原因之一)是的,文本字段上的索引大小有限,但对url使用
    BLOB/text
    是不明智的,因为您不需要那么长的长度。更好的用户a
    VARCHAR
    具有适当的长度。校验和更好。url的最大长度由规范决定是无限的。实际上@DanFarell,使用校验和实际上是一个好主意。要请注意,OP将有另一个问题需要解决,即规范化URL,使其不具有相同的URL和不同顺序的参数,或具有相同的URL,但具有会话参数。太棒了!我一直在寻找一种解决方案,该解决方案不尝试从BLOB/文本字段中生成密钥。
    create table urls ( 
        id int unsigned not null auto_increment primary key, 
        binsha512 binary(64), 
        url text, 
        unique key(binsha512), 
        duplicates int unsigned not null default 0 ) ;
    
    set @newurl = "http://danf.us"; -- so we only have to send it once
    
    insert into urls set 
        url=@newurl, 
        binsha512= UNHEX( SHA2( @newurl,512)) 
        on duplicate key update duplicates = duplicates + 1;