我有一部分简单的代码,由于唯一索引约束而必须失败.但是这两个对象都被添加到数据库中,并且可以查询,尽管有独特的索引.
BasicDBObject typeUrlIndex = new BasicDBObject();
typeUrlIndex.put(FIELD_TYPE_URL, 1);
BasicDBObject typeUrlIndexOptions = new BasicDBObject();
typeUrlIndexOptions.put("background", true);
typeUrlIndexOptions.put("sparse", true);
typeUrlIndexOptions.put("unique", true);
typeUrlIndexOptions.put("dropDups", true);
objects.ensureIndex(typeUrlIndex, typeUrlIndexOptions);
// here I can check, that index is really created, and it is true.
List<DBObject> indexes = objects.getIndexInfo();
BasicDBObject dbo1 = new BasicDBObject(FIELD_TYPE_URL, "aaa");
objects.save(dbo1);
BasicDBObject dbo2 = new BasicDBObject(FIELD_TYPE_URL, "aaa");
objects.save(dbo2);
Run Code Online (Sandbox Code Playgroud)
两个对象都被保存并获得不同的_id.
UPD. 我发现,出了什么问题.保存到数据库后,这两个对象都会获得自己的id,但实际上第二个对象没有保存(即使是给定的id也无法查询它).
感谢araqnid,给出了正确答案.不幸的是,我没有足够的评级来投票.
INSERT INTO `ree`.`media`
(`CREATEDATE`, `FILETYPE`, `MIMETYPE`, `MLSNUMBER`, `MODIFYDATE`, `POSITION`, `URL`) VALUES
('2011-12-27T15:00:16', 'PRIMARY PHOTO', 'image/jpeg', 5030011414, '2011-12-27T15:00:16', 1, 'http://image.realcomponline.com/photos.rps?PATH=PROPERTY/57FA/57FAA44C48854C/3QQGONGA03I7CN.jpg&g=100&sp=0&l=0&t=0&r=10000&b=10000&o=0&1cf=0&w=320&h=240'),
('2011-12-27T15:00:18', 'PRIMARY PHOTO', 'image/jpeg', 5030011507, '2011-12-27T15:00:18', 1, 'http://image.realcomponline.com/photos.rps?PATH=PROPERTY/6FC7/6FC7B6F88D8F45/3SQGONGA01RXH1.jpg&g=100&sp=0&l=0&t=0&r=10000&b=10000&o=0&1cf=0&w=320&h=240')
Run Code Online (Sandbox Code Playgroud)
错误: 关键'uneek'重复输入'2147483647-1'
在区分两个插入之前,似乎我的MLSNUMBER的UNIQUE键没有解析整个数字.
两者都以5030011开头......
以下是我构建密钥的方法:
ADD UNIQUE uneek
( MLSNUMBER
, POSITION
)
有没有办法建立这个密钥,所以它接受整个10位而不是前7位?
提前致谢!
我在MongoDB中遇到了多键索引的问题.
我有一个名为的集合users
,其文档看起来或多或少像这样:
{
"_id": ObjectId(),
"name": "John Smith",
...
"votes": [
{
"type": "news",
"votedObjectId": "123"
},
{
"type": "blog",
"votedObjectId": "124"
},
{
"type": "news"
"votedObjectId": "225"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个索引votedObjectId
,我希望用户只为每篇文章投票一次.
我确保了一个唯一的索引(代码在node.js - mongoskin模块中):
`this.ensureIndex({'votes.votedObjectId': 1}, {unique: true}, ...)`
Run Code Online (Sandbox Code Playgroud)
然后我尝试了两次同一篇文章的投票,它实际上添加了两次完全相同的投票.
如何确保数组不包含重复元素?
PS
我使用{safe:true}执行所有插入操作,并且我获得的重复值不会被插入操作返回,而是实际插入到集合中.
我正在尝试将数据库转换为使用 utf8mb4 而不是 utf8。除了一张桌子之外,一切都很顺利:
\nCREATE TABLE `search_terms` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `search_term` varchar(128) NOT NULL,\n `time_added` timestamp NULL DEFAULT NULL,\n `count` int(10) unsigned NOT NULL DEFAULT '0',\n PRIMARY KEY (`id`),\n UNIQUE KEY `search_term` (`search_term`),\n KEY `search_term_count` (`count`)\n) ENGINE=InnoDB AUTO_INCREMENT=198981 DEFAULT CHARSET=utf8;\n
Run Code Online (Sandbox Code Playgroud)\n基本上,它所做的就是每次有人在表单中搜索某些内容时保存一个条目,以便我们可以跟踪搜索次数,非常简单。
\n有一个唯一索引,search_term
因为我们希望每个搜索词只有一行,而不是增加计数值。
但是,当转换为 utf8mb4 时,我收到重复输入错误。这是我正在运行的命令:
\nALTER TABLE `search_terms` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n
Run Code Online (Sandbox Code Playgroud)\n在数据库中我可以看到类似这样的各种示例:
\n\n\n\xef\xbd\x86\xef\xbd\x8d\xef\xbc\x92\xef\xbc\x90\xef\xbc\x91\xef\xbc\x92
\n\xef\xbd\x86\xef\xbd\x8d2012
\n调频2012
\n
在当前的 utf8 字符集中,这些都被视为唯一并存在于数据库中,而不会出现search_term …
我正在向用户表(来自许多站点的许多用户)输入数据:
myisam default collation latin1_swedish
....
将该数据导入到 innodb table utf8_general
我已经在username,site_id
组合上放置了一个唯一的密钥,但这对于同一站点的2个用户来说是失败的:
user 1 dranfog,
user 2 drånfog
Run Code Online (Sandbox Code Playgroud)
如果我跑:
SELECT IF('å' = 'a', 'yep', 'nope');
Run Code Online (Sandbox Code Playgroud)
直接在目标数据库上使用utf8编码,我得到'yep'
.
任何解决此问题的提示都非常受欢迎.我的印象是utf8会将这些视为不同的字符,但似乎并非如此.
我在MongoDB中有一个用户集合._id目前是标准的MongoDB生成的ObjectId.我对所需的"电子邮件"字段也有一个唯一的键约束.这似乎是一种浪费.
我有什么理由不放弃"电子邮件"字段并将该数据作为_id字段吗?
我看到一个在Rails中同时具有db级和代码级验证的表.
CREATE UNIQUE INDEX some_index_name ON joined_table_name USING btree (user_id, restriction_id);
Run Code Online (Sandbox Code Playgroud)
和代码级别:
class SomeJoinTable
validates_uniqueness_of :restriction_id, :scope => :user_id
end
Run Code Online (Sandbox Code Playgroud)
两者兼有的好处是什么?
这是我当前的数据库结构:
Col1 Col2
1 abc123
1 abc123
1 def321
2 xyz789
2 xyz789
Run Code Online (Sandbox Code Playgroud)
我想确保 中的任何条目Col2
仅用于 中的相同条目Col1
。例如,数据库允许您添加这一行:
Col1 Col2
2 lmn456
Run Code Online (Sandbox Code Playgroud)
但不是这个:
Col1 Col2
2 abc123
Run Code Online (Sandbox Code Playgroud)
有没有办法通过唯一索引来强制执行此操作?通常,唯一性强制特定组合对于整个表来说是唯一的(即(1,abc123)
仅出现一次)。
我无法移动Col2
到不同的表并使用联接,因为我需要支持Col2
每个条目的多个值Col1
- 它不是一对一的。
嘿,我需要合并我的两个集合,但 mongo 返回“无法找到索引来验证连接字段是否唯一”
1.创建唯一索引 2.删除whenMatched/whenNotMatched
db.getCollection("GeoLite2-City-Blocks-IPv4").aggregate([
{$match:{longitude:{$gt:175,$lt:180}}},
{$merge:{
into:"GeoLite2-City-Locations-ja",
on:"geoname_id",
whenMatched: "replace",
whenNotMatched: "insert"
}}
])
Run Code Online (Sandbox Code Playgroud)
预期:返回 GeoLite2-City-Blocks-IPv4 包括 GeoLite2-City-Locations-ja
我知道如果数据是唯一的,理论上唯一索引会比非唯一索引更快。
因为唯一索引能够提供更多的信息,让查询优化器选择更有效的执行计划。
我正在做一些测试,想证明唯一索引可能比执行计划中的非唯一索引更好,但结果显示它们是相同的......
CREATE TABLE T3(
ID INT NOT NULL,
val INT NOT NULL,
col1 UUID NOT NULL,
col2 UUID NOT NULL,
col3 UUID NOT NULL,
col4 UUID NOT NULL,
col5 UUID NOT NULL,
col6 UUID NOT NULL
);
CREATE INDEX IX_ID_T3 ON T3 (ID);
CREATE UNIQUE INDEX UIX_ID_T3 ON T3 (ID);
INSERT INTO T3
SELECT i,
RANDOM() * 1000000,
md5(random()::text || clock_timestamp()::text)::uuid,
md5(random()::text || clock_timestamp()::text)::uuid,
md5(random()::text || clock_timestamp()::text)::uuid,
md5(random()::text || clock_timestamp()::text)::uuid,
md5(random()::text || clock_timestamp()::text)::uuid,
md5(random()::text || clock_timestamp()::text)::uuid
FROM generate_series(1,1000000) …
Run Code Online (Sandbox Code Playgroud) unique-index ×10
mongodb ×4
mysql ×3
indexing ×2
postgresql ×2
utf-8 ×2
aggregate ×1
collation ×1
merge ×1
php ×1
sql ×1
unicode ×1
utf8mb4 ×1
validation ×1