首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MariaDB 10.0,innodb:条件唯一约束?

MariaDB 10.0,innodb:条件唯一约束?
EN

Stack Overflow用户
提问于 2014-08-27 08:04:37
回答 1查看 446关注 0票数 1

我的模式,简化版:

人员: id (int),name (string),allow_duplicate_name (int)

allow_duplicate_name为1表示true,0表示false。

如果新记录的name字段不是唯一的,但仅当它们具有allow_duplicate_name == 1时,我想阻止插入新记录。因此,如果我们有下表:

代码语言:javascript
运行
复制
id  name  allow_duplicate_name
1   jack  1
2   jack  1
3   ryan  1
4   jack  1

那么下面的语句应该会成功:

代码语言:javascript
运行
复制
INSERT INTO people (name, allow_duplicate_name)
VALUES ('jack', 1);

但是下面的语句应该失败:

代码语言:javascript
运行
复制
INSERT INTO people (name, allow_duplicate_name)
VALUES ('jack', 0);

我的根本问题是,我有一个竞态条件,两个并发事务都会检查是否存在重复项,查看是否存在重复项,然后使用相同的名称和allow_duplicate_name=0插入一个新记录。

在竞争条件下,每个事务看到对方,然后回滚自己,但我们绝对不允许使用allow_duplicate_name=0设置重复名称的插入/更新。

我听说我们的设置是这样的,使用存储过程是非常痛苦的,但也许存储过程是解决这个问题的唯一明智的方法?

EN

Stack Overflow用户

发布于 2014-08-27 08:27:48

你几乎可以做你想做的事。但是您需要更改变量的名称。其关键思想是唯一索引允许复制NULL值。因此,当"allow_duplicate_name“为NULL时,您可以获得副本。

我建议将该字段重命名为类似于DuplicatesNotAllowed的名称。然后创建索引:

代码语言:javascript
运行
复制
 create unique index idx_people_name_duplicatesnotallowed on people(name, duplciatesnotallowed);

您可以按以下方式插入值:

代码语言:javascript
运行
复制
INSERT INTO people (name, duplciatesnotallowed)
    VALUES ('jack', NULL);

这将会成功。

代码语言:javascript
运行
复制
INSERT INTO people (name, allow_duplicate_name)
    VALUES ('jack', 1);

这将在第二次运行时失败。但是,如果您更新现有行的字段,则此操作将失败。我不确定这是否能满足你的需求。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25516988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档