Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.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
在SQL中生成反对称键_Sql_Mysql_Unique_Asymmetric - Fatal编程技术网

在SQL中生成反对称键

在SQL中生成反对称键,sql,mysql,unique,asymmetric,Sql,Mysql,Unique,Asymmetric,我希望在创建这个唯一的密钥之后,不可能添加B,A 例如:“Michael”、“Jackson”将不允许稍后插入“Jackson”、“Michael”。我假设您的应用程序处理的是除真名以外的其他内容。(因为“杰克逊·迈克尔”在英语中是一个合法的名字。“约翰·大卫”和“大卫·约翰”也是如此。) 最简单的方法是使用CHECK()约束来强制执行两列之间的字母顺序 ALTER TABLE `test` ADD UNIQUE ( `a` , `b` ); altertable测试 添加约束测试\uα\u顺

我希望在创建这个唯一的密钥之后,不可能添加B,A


例如:“Michael”、“Jackson”将不允许稍后插入“Jackson”、“Michael”。

我假设您的应用程序处理的是除真名以外的其他内容。(因为“杰克逊·迈克尔”在英语中是一个合法的名字。“约翰·大卫”和“大卫·约翰”也是如此。)

最简单的方法是使用CHECK()约束来强制执行两列之间的字母顺序

ALTER TABLE `test` ADD UNIQUE (
`a` ,
`b`
);
altertable测试
添加约束测试\uα\u顺序
检查(a
但请注意,您可能也会遇到区分大小写的问题。也就是说,您的dbms可能认为{'Jackson','Michael'}和{'Jackson','Michael'}是两个不同的有效值。如果区分大小写是一个问题,我见过的最常见的解决方案是强制使用小写值,如下所示

alter table test
add constraint test_alpha_order
check (a < b);
altertable测试
添加约束测试\uα\u顺序
检查(a=下部(a)和
b=较低(b)和
a
我假设您的应用程序处理的是真实姓名以外的内容。(因为“杰克逊·迈克尔”在英语中是一个合法的名字。“约翰·大卫”和“大卫·约翰”也是如此。)

最简单的方法是使用CHECK()约束来强制执行两列之间的字母顺序

ALTER TABLE `test` ADD UNIQUE (
`a` ,
`b`
);
altertable测试
添加约束测试\uα\u顺序
检查(a
但请注意,您可能也会遇到区分大小写的问题。也就是说,您的dbms可能认为{'Jackson','Michael'}和{'Jackson','Michael'}是两个不同的有效值。如果区分大小写是一个问题,我见过的最常见的解决方案是强制使用小写值,如下所示

alter table test
add constraint test_alpha_order
check (a < b);
altertable测试
添加约束测试\uα\u顺序
检查(a=下部(a)和
b=较低(b)和
a
关于我关于MySQL中缺少检查约束的评论,一个众所周知的解决方法是触发因素。您可以在触发器上插入前执行以下检查:

alter table test
add constraint test_alpha_order
check (a = lower(a) and
       b = lower(b) and
       a < b );
但要使其失败,您必须求助于MySQL Trickry 1.0(前面在中描述)

因此,您需要以下内容:(已测试)


注意:我在这里忽略了不区分大小写的问题——您的问题似乎并不要求这样做。

关于我关于MySQL中缺少检查约束的评论,一个众所周知的解决方法就是触发因素。您可以在触发器上插入前执行以下检查:

alter table test
add constraint test_alpha_order
check (a = lower(a) and
       b = lower(b) and
       a < b );
但要使其失败,您必须求助于MySQL Trickry 1.0(前面在中描述)

因此,您需要以下内容:(已测试)


注意:我忽略了不区分大小写的问题——您的问题似乎并不要求这样。

我以为MySQL不支持检查约束()年前,MySQL因为声称它支持外键约束而声名狼藉。它的文档说类似“MySQL支持外键约束。所有外键约束都会被解析,然后被忽略。”;这就是MySQL 5.5仍然支持CHECK()约束的原因。如果要在MySQL中实现这样的约束,就必须编写触发器。考虑到MySQL对触发器和存储函数的限制,我也不确定这是否行得通。基本上,你必须采取某种手段(强制出错而不是发出错误信号),但你可以让它工作。他们仍然声称你所说的检查约束(在中搜索“忽略”)。我认为MySQL不支持检查约束()年前,MySQL因为声称它支持外键约束而臭名昭著。它的文档说类似“MySQL支持外键约束。所有外键约束都会被解析,然后被忽略。”;这就是MySQL 5.5仍然支持CHECK()约束的原因。如果要在MySQL中实现这样的约束,就必须编写触发器。考虑到MySQL对触发器和存储函数的限制,我也不确定这是否行得通。基本上,你必须采取某种手段(强制出错而不是发出错误信号),但你可以让它工作。他们仍然声称您所说的检查约束(在中搜索“忽略”)。