SQL:当UNIQUE键约束不适用时处理表中的唯一值

时间:2010-10-22 09:33:31

标签: sql mysql

当您不能使用UNIQUE约束时需要维护具有唯一值的表时,您会怎么做?

例如,我使用MySQL并希望将我的网址映射到ID。所以我创建了一个表:

CREATE TABLE url (id INTEGER PRIMARY KEY AUTO_INCREMENT, url VARCHAR(2048));

问题是mysql不允许大于1000字节的唯一字段。 一般如何插入只在sql中不存在?

3 个答案:

答案 0 :(得分:5)

您可以创建一个额外字段,该字段可以是网址的哈希值,例如md5,并使该哈希字段唯一。您当然可以确定该URL是唯一的,并且几乎100%确定您可以插入新的URL(如果它尚不存在)。

创建表锁是很诱人的,但创建表锁将隐式提交您正在处理的事务:http://www.databasesandlife.com/mysql-lock-tables-does-an-implicit-commit/

您可以创建单行表格,例如名称mutex,type = InnoDB,在其中插入一行,并在该行上执行select for update以创建与事务兼容的锁。这是令人讨厌的,但这是我在我的应用程序中在MySQL中执行表锁的方式:(

答案 1 :(得分:1)

您可以使用not exist条件:

insert  YourTable
        (url)
values  ('blah blah blah')
where   not exists
        (
        select  *
        from    YourTable
        where   url = 'blah blah blah'
        )

答案 2 :(得分:1)

在我看来,处理它的最好方法是编写一个触发器。触发器将检查表中的每个值以查看它们是否相等,如果是,则引发错误。但是,我认为URL不会超过1000个字符,但如果它在你的情况下,你应该写一个触发器来处理唯一性。