在表格中只允许一行带有“ main”标志的行

时间:2019-03-14 07:30:41

标签: mysql indexing

我有一张桌子,如下:

mysql>描述组;

+--------------------+---------------+------+-----+---------+----------------+
| Field              | Type          | Null | Key | Default | Extra          |
+--------------------+---------------+------+-----+---------+----------------+
| id                 | int(11)       | NO   | PRI | NULL    | auto_increment |
| jobId              | int(11)       | NO   | MUL | NULL    |                |
| name               | varchar(45)   | YES  |     | NULL    |                |
| notes              | varchar(1024) | YES  |     |         |                |
| main               | tinyint(1)    | NO   |     | 0       |                |
+--------------------+---------------+------+-----+---------+----------------+

还有另一个与作业无关的表,此处不相关。这是“子”表,作业为1:n。我只需要这些组之一。

因此,作业将具有多个“组”条目;我希望这样,对于一项特定工作,只能将其中一个设置为“ 1”。

它是在代码中强制执行的,但现在不在数据库中。

是否可以在数据库级别强制执行此操作?

1 个答案:

答案 0 :(得分:1)

您可以在两列上创建唯一索引:

UNIQUE KEY uix_1 (jobid, main)

唯一索引允许多个NULL值可为空的列,因此对(1, NULL)对可以多次插入,而对(1, 1)对只能插入一次。

如果要将main列的值限制为1和NULL,则有一些选择:

  • 使用CHECK约束–需要MySQL 8
  • 使用ENUM('yes') –使用数字作为枚举值有误
  • 创建FOREIGN KEY (main) REFERENCES main_values(main)
  • 使用BIT(1)数据类型-这也将允许0