mysql - MySQL - 唯一的“每个 FK”,可为空的列
问题描述
我有下表:
CREATE TABLE `Firmware_port_set` (
`Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`firmware_id` int(10) unsigned NOT NULL,
`address` int(10) unsigned NOT NULL,
`set_id` int(10) unsigned NOT NULL,
`order_in_firmware` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `firmware_id` (`firmware_id`,`address`),
KEY `fk_fps_set` (`set_id`),
KEY `fk_fps_firmware` (`firmware_id`),
CONSTRAINT `fk_fps_firmware` FOREIGN KEY (`firmware_id`) REFERENCES `Firmware` (`Id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_fps_set` FOREIGN KEY (`set_id`) REFERENCES `Port_set_template` (`Id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=480 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
其中列order_in_firmware
是排序的可选规范。如果此列为空,则将根据地址列进行排序 - 基本上,查询是..ORDER BY COALESCE(order_in_firmware, address)
以下是数据示例:
Id, firmware_id, address, set_id, order_in_firmware
"461","32","105","13",NULL
"462","32","185","13",NULL
"463","32","265","13",NULL
"464","34","36","14","8"
"465","34","44","14","9"
"466","34","52","14","10"
"467","34","60","14","11"
"468","34","68","14","12"
"469","34","76","14","13"
"470","34","84","14","14"
"471","34","92","14","15"
"472","34","100","15","0"
"473","34","114","15","1"
"474","34","128","15","2"
"475","34","142","15","3"
"476","34","156","15","4"
"477","34","170","15","5"
"478","34","184","15","6"
"479","34","198","15","7"
如何创建一个约束来强制order_in_firmware
列的值是唯一的,但只有唯一的“每个 FK 值”(firmware_id
)并且同时仍然可以为空?
解决方案
使“其他”列的对具有order_in_firmware
唯一性。
CREATE TABLE `firmware_port_set`
(...
UNIQUE (`firmware_id`,
`order_in_firmware`)
...) ...
从您的帖子中不清楚哪个是“其他”列。我假设firmware_id
. 如果这是错误的,您需要相应地更改代码。
推荐阅读
- ruby-on-rails - Rails 模型 - before_read 或类似的,允许您在访问数据之前运行方法
- events - 未触发工作表事件
- python - 我的 DNA 序列匹配器程序输出错误
- python - 在我的工作表(excel)中,我有 2 列需要计算行数。我需要依靠使用熊猫的pycharm。我怎样才能做到这一点?
- wordpress - wordpress front-page.php 未正确加载 css
- sql - 有没有办法在 SQL 中使用子查询创建临时表?
- tensorflow - 如何解决张量流中不推荐使用的特征列警告
- google-chrome-extension - 在 chrome 扩展清单 v3 中从后台脚本播放音频
- amazon-web-services - AWS API Gateway 主体映射模板到 Graphql
- sql - Oracle SQL 计算到最接近的 1 号 除了确定的天数