【发布时间】:2016-10-14 19:37:04
【问题描述】:
背景
我有一个应用程序,用户可以在其中提交产品评论。用户还可以编辑以前提交的评论或为同一产品提交另一条评论。
我正在实现一个“自动保存”功能,它每 X 秒保存一次表单数据。如果页面被意外关闭,用户可以恢复这个“草稿”。
这是我的表格的简化版:
CREATE TABLE `review_autosave_data` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`review_id` int(11) unsigned DEFAULT NULL,
`product_id` int(11) unsigned NOT NULL,
`user_id` int(11) unsigned NOT NULL,
`review` blob,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_index` (`product_id`, `user_id`),
KEY `fk_review_autosave_data_review_id (`review_id`),
KEY `fk_review_autosave_data_product_id (`product_id`),
KEY `fk_review_autosave_data_user_id (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
请记住,此表仅存储草稿,而不是实际评论。如果我们正在编辑评论,review_id 将指向该评论。如果我们正在创建新评论,此字段将为 NULL。
什么工作
这是我插入新草稿的查询:
INSERT INTO review_autosave_data (review_id, product_id, user_id, review)
VALUES (25, 50, 1, "lorem ipsum")
ON DUPLICATE KEY
UPDATE review = "lorem ipsum";
这适用于插入 新 审查草稿。索引会阻止在 product_id 和 user_id 的组合已存在的位置插入新行。
什么不工作
我的问题是为现有评论插入草稿,其中review_id 需要指向现有评论,因为理想情况下,此处的索引需要是product_id、@987654329 的组合@ 和 review_id。不幸的是,在我的情况下,以下适用:
UNIQUE 索引允许包含 NULL 的列有多个 NULL 值
虽然有关于上述引用的问题和答案,但我不一定对实现将空值作为唯一索引的一部分感兴趣 - 而是寻找解决方法。
我想我可以先做一个选择查询来检查上述组合是否存在,如果不存在则继续主查询。但如果可能的话,我想把所有这些都集中到一个查询中。想法?
谢谢。
【问题讨论】:
-
这个问题已经很长了,所以我尝试尽可能地修剪它。如果有什么我遗漏或需要澄清的地方,请告诉我。
标签: mysql