IT

두 열의 조합을 위한 양방향 고유 키 제약 조건

itgroup 2022. 10. 19. 22:09
반응형

두 열의 조합을 위한 양방향 고유 키 제약 조건

MySQL에 아래 테이블 열이 있습니다.

id
user_primary_email
user_secondary_email

요.user_primary_email ★★★★★★★★★★★★★★★★★」user_secondary_email를 사용하여 얻을 수 있는 일의UNIQUE KEY unique_key_name (user_primary_email, user_secondary_email)

위의 고유한 키 제약 조건을 추가하면 아래의 시나리오를 달성하거나 개별 열에 고유한 키를 추가하는 것만으로 달성할 수 있습니다.

user_primary_email = 'xyz@gmail.com' AND user_secondary_email = 'pqr@gmail.com'
user_primary_email = 'xyz@gmail.com' AND user_secondary_email = 'pqr@gmail.com' //This will not be allowed to enter due to unique key constraint

현재 제가 직면하고 있는 문제는 아래와 같이 동일한 조합을 추가하여서는 안 된다는 것입니다.

user_primary_email = 'pqr@gmail.com' AND user_secondary_email = 'xyz@gmail.com' //This should not be allowed to add since already same email id combination added once

id    |   user_primary_email   |   user_secondary_email
-------------------------------------------------------
1     |   xyz@gmail.com        |   pqr@gmail.com
-------------------------------------------------------
2     |   pqr@gmail.com        |   xyz@gmail.com       
-------------------------------------------------------

위의 경우 id 2 행을 삽입할 때 id 1 행에 이미 두 이메일 ID 조합이 사용되고 있기 때문에 오류가 발생합니다.

어떤 도움이라도 좋습니다.

어느 마리아에서도DB:

CREATE TABLE `t` (
  `id` int(11) NOT NULL,
  `user_primary_email` varchar(64) DEFAULT NULL,
  `user_secondary_email` varchar(64) DEFAULT NULL,
  `mycheck` varchar(128) AS (IF(user_primary_email<user_secondary_email,CONCAT(user_primary_email,user_secondary_email),CONCAT(user_secondary_email,user_primary_email))) PERSISTENT,
  PRIMARY KEY (`id`),
  UNIQUE KEY `mycheck` (`mycheck`)
);

MariaDB [test]> insert into t values (1,'a','b',null);
Query OK, 1 row affected (0.03 sec)

MariaDB [test]> insert into t values (2,'b','a',null);
ERROR 1062 (23000): Duplicate entry 'ab' for key 'mycheck'

이를 직접 지원하는 것은 아니지만 회피책을 사용하여 양방향 키를 만들 수 있습니다.즉, 2개의 컬럼을 정렬한 버전에 고유 키가 필요합니다.

다행히도, 당신은 그것을 아주 쉽게 할 수 있습니다.MySQL 5.7.6+는 생성된 열과 고유한 인덱스를 지원하므로 두 값을 정렬하고 고유성을 적용하는 데 사용할 수 있습니다.

create table testBiDirKey (
  a varchar(100), 
  b varchar(100),
  a_ordered varchar(100) as (least(a, b)) STORED,
  b_ordered varchar(100) as (greatest(a, b)) STORED,
  unique key unqBi_test_ab (a_ordered, b_ordered)
);

insert into testBiDirKey(a,b) values('a', 'b');
insert into testBiDirKey(a,b) values('b', 'a');
Error Code: 1062. Duplicate entry 'a-b' for key 'unqBi_test_ab'

으로 치료하다null, 키와 하게 사용할 수 있습니다.

insert into testBiDirKey(a,b) values('a', null);
insert into testBiDirKey(a,b) values('a', null);
insert into testBiDirKey(a,b) values(null, 'a');

모두 허용됩니다. 해서 더하면 요.coalesce(x,'')값을 둘 중 하나).null''를 참조해 주세요를 참조해 주세요.에 값을 를 들어 값이 않은 ),)는의 컬럼을 1개의 할 수 있습니다.,되는 것 이 없습니다.- 단, 1 개개개개개 - - - - - - - - - - - - - - - - - - - - - - - - - -.

5.7.8은 STORED키워드를 입력하면 인덱스에서 이러한 열을 사용할 수 있습니다.이 키워드는 값을 저장(디스크 공간 사용)하거나 필요할 때 계산(기본값)하는 경우에 적용됩니다.

5.7할 수 (MySQL 5.7.6에서는).update ★★★★★★★★★★★★★★★★★」insert하려면 , 더 가 필요합니다 두 열을 이 값으로 업데이트하려면 동일한 논리가 적용되며, 코드만 조금 더 있으면 됩니다.

언급URL : https://stackoverflow.com/questions/41040301/bi-directional-unique-key-constraint-for-combination-of-two-columns

반응형