假设我有一个表格,我希望MY_COLUMN的值是唯一的,除非值为'xyz'。换句话说,MY_COLUMN可能是多行中的'xyz',但所有不是'xyz'的值必须是唯一的。是否可以设置实现此目的的约束?
答案 0 :(得分:3)
UNIQUE索引创建一个约束,以便索引中的所有值 必须是截然不同的如果您尝试使用a添加新行,则会发生错误 与现有行匹配的键值。对于所有引擎,都是独一无二的 index允许包含NULL的列的多个NULL值。
因此,创建一个可以为空的列,当您查询表时,只需使用ISNULL(MY_COLUMN, 'xyz')
。
答案 1 :(得分:0)
您无法设置约束来执行此操作,但是如果您在内部执行此操作,请说一个java项目,您可以执行类似
的操作If (MY_COLUMN != "xyz"){
Get records of table with "xyz" in it
X = //maping would equal "Select MY_COLUMN from table" (or select * from table depending on your mapping
然后检查是否有匹配,最后如果不匹配,则运行insert语句。如果你正在做这个自由职业者,也许另一个专栏只是一个bool来说如果是真的,那么MY_COLUMN ='xyz'否则看看MY_COLUMN并得到val。这是一个棘手的问题。
答案 2 :(得分:0)
考虑到这一点,我想我会提供我的意见。
正如其他答案正确指出的那样,MySQL不能有一个有重复的UNIQUE索引。
我不打算辩论这不容易引起混淆的事实,也不会甚至你应该做这样的事情。
你可以通过在my_column上使用常规索引来实现我认为相同的结果,但也将其设置为NOT NULL(这很重要,因为没有这个,触发器不会在重复索引上引发错误)。 然后,您可以按如下方式为my_table创建TRIGGER:
CREATE TRIGGER my_table_unique_index_with_exception BEFORE INSERT ON my_table
FOR EACH ROW BEGIN
IF NEW.my_column != 'xyz' THEN
-- The value isn't 'xyz' so only one instance of this value is allowed
-- check the count and if the value exists set it to NULL which will thorw
-- an error as my_column annot be NULL
IF (SELECT COUNT(*) FROM my_table WHERE my_table.my_row = NEW.my_column) > 0 THEN
SET NEW.my_column = NULL;
END IF;
END