你可以用一个小技巧来做到这一点。
包含一个带有 IF() 函数的虚拟永久列。
如果状态 = 1,这将存储 parent_id,否则为 NULL
所以你可以在这个字段上创建一个 UNIQUE KEY
CREATE TABLE `cond` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
`status` int(11) DEFAULT NULL,
`cond_status` int(11) GENERATED ALWAYS AS (if(`status` = 1,`parent_id`,NULL)) STORED,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_cond_status` (`cond_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
样本
MariaDB [Bernd]> select * from cond;
Empty set (0.10 sec)
MariaDB [Bernd]> INSERT INTO cond (parent_id,`status`) VALUES(1234, 0);
Query OK, 1 row affected (0.05 sec)
MariaDB [Bernd]> INSERT INTO cond (parent_id,`status`) VALUES(1235, 0);
Query OK, 1 row affected (0.01 sec)
MariaDB [Bernd]> INSERT INTO cond (parent_id,`status`) VALUES(1235, 2);
Query OK, 1 row affected (0.00 sec)
MariaDB [Bernd]> INSERT INTO cond (parent_id,`status`) VALUES(1235, 2);
Query OK, 1 row affected (0.02 sec)
MariaDB [Bernd]> INSERT INTO cond (parent_id,`status`) VALUES(1235, 1);
Query OK, 1 row affected (0.22 sec)
MariaDB [Bernd]> INSERT INTO cond (parent_id,`status`) VALUES(1235, 4);
Query OK, 1 row affected (0.01 sec)
MariaDB [Bernd]> INSERT INTO cond (parent_id,`status`) VALUES(1235, 1);
ERROR 1062 (23000): Duplicate entry '1235' for key 'idx_cond_status'
MariaDB [Bernd]>
MariaDB [Bernd]> select * from cond;
+----+-----------+--------+-------------+
| id | parent_id | status | cond_status |
+----+-----------+--------+-------------+
| 1 | 1234 | 0 | NULL |
| 2 | 1235 | 0 | NULL |
| 3 | 1235 | 2 | NULL |
| 4 | 1235 | 2 | NULL |
| 5 | 1235 | 1 | 1235 |
| 6 | 1235 | 4 | NULL |
+----+-----------+--------+-------------+
6 rows in set (0.08 sec)
MariaDB [Bernd]>
注意:创建表适用于 MariaDB,但在 MySQL 中几乎相同