Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:column=x时唯一_Mysql_Unique - Fatal编程技术网

MySQL:column=x时唯一

MySQL:column=x时唯一,mysql,unique,Mysql,Unique,假设一个表有3列,那么我是否可以使第1列和第2列之间的混合是唯一的当且仅当第3列等于x 这将使这项工作: ----------------------------------------------------- | A | B | C | ----------------------------------------------------- | 1 | 2 |

假设一个表有3列,那么我是否可以使第1列和第2列之间的混合是唯一的当且仅当第3列等于x

这将使这项工作:

----------------------------------------------------- | A | B | C | ----------------------------------------------------- | 1 | 2 | x | ----------------------------------------------------- | 2 | 1 | x | ----------------------------------------------------- | 0 | 0 | y | ----------------------------------------------------- | 0 | 0 | y | ----------------------------------------------------- 而这不会:

| A | B | C | ----------------------------------------------------- | 2 | 2 | x | ----------------------------------------------------- | 2 | 2 | x | ----------------------------------------------------- | 0 | 0 | y | ----------------------------------------------------- | 0 | 0 | y | ----------------------------------------------------- 尝试:


您可以创建触发器:

DELIMITER ;;

CREATE TRIGGER special_unique_test BEFORE INSERT ON my_table FOR EACH ROW
IF NEW.C = 'x' AND EXISTS (
  SELECT * FROM my_table WHERE A = NEW.A AND B = NEW.B AND C = 'x'
) THEN
  CALL raise_error;
END IF;;

DELIMITER ;
我建议在A、B、C上保持一个指数,以保持合理的性能


然而,这不会产生与插入相同的好处。。。在重复密钥更新时,将其替换为真正的唯一密钥。

|0 | 0 | y在第一组密钥中不是唯一的?!以及如何为每个分组值A、B选择列C的唯一值?最小值,最大值。。不,这就是我想要的。如果C是y,那么A和B之间的混合不应该是唯一的。如果它是x,那么A&B应该是唯一的。那么,如果C列='x',你希望A,B值的组合必须是唯一的?i、 e.仅当C='x'正确时,才使用唯一键A,B?如果是这样,请用这些细节编辑您的问题。@MahmoudGamal这是正确的。如果C=x两次,组合A和B就不可能相同,但是如果C=yI,组合A和B就可以相同。我不知道我是否实现了错误,但现在我无法插入任何值。我所做的是,我在那张表上用phpmyadmin运行了你的代码,现在当我插入一些东西时,什么也没有发生。当我在phpmyadmin中插入数据时,出现了一些奇怪的错误,我将在大约4小时后再次访问我的计算机时对其进行检查。我得到了以下错误:1436-线程堆栈溢出:5768字节用于131072字节堆栈,需要128000字节。使用“mysqld-O thread_stack=”指定一个更大的堆栈。@Oskwish:听起来你要么运行一个用128KiB堆栈编译的奇怪二进制文件,要么用128KiB的显式堆栈大小覆盖默认值,例如选项文件、命令行参数、运行时设置?。32位体系结构上的默认值通常为192KiB,64位体系结构上的默认值通常为256KiB。@eggyal那么我该如何解决这个问题呢?
DELIMITER ;;

CREATE TRIGGER special_unique_test BEFORE INSERT ON my_table FOR EACH ROW
IF NEW.C = 'x' AND EXISTS (
  SELECT * FROM my_table WHERE A = NEW.A AND B = NEW.B AND C = 'x'
) THEN
  CALL raise_error;
END IF;;

DELIMITER ;