当您不能使用UNIQUE约束时需要维护具有唯一值的表时,您会怎么做?
例如,我使用MySQL并希望将我的网址映射到ID。所以我创建了一个表:
CREATE TABLE url (id INTEGER PRIMARY KEY AUTO_INCREMENT, url VARCHAR(2048));
问题是mysql不允许大于1000字节的唯一字段。 一般如何插入只在sql中不存在?
答案 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个字符,但如果它在你的情况下,你应该写一个触发器来处理唯一性。