数据库将存储有关硬件设备及其收集的数据的信息。我创建了一个设备表来存储可用的硬件设备:
CREATE TABLE IF NOT EXISTS `devices` (
`deviceID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`deviceType` int(10) unsigned NOT NULL,
`updateFrequency` int(10) unsigned NOT NULL,
PRIMARY KEY (`deviceID`,`deviceType`)
)
deviceID将对应于实际硬件ID(从1到12)。由于有两种类型的硬件设备,我认为根据哪个硬件设备创建一个0或1的deviceType是合适的,并制作复合主键。
为了存储该数据,我创建了另一个表。
CREATE TABLE IF NOT EXISTS `data` (
`dataID` int(11) unsigned NOT NULL AUTO_INCREMENT,
`deviceID` int(11) unsigned NOT NULL,
`payload` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
PRIMARY KEY (`dataID`),
KEY `fk_data_devices` (`deviceID`),
CONSTRAINT `fk_data_devices`
FOREIGN KEY (`deviceID`)
REFERENCES `devices` (`deviceID`)
ON DELETE CASCADE
)
问题显然是我无法在数据内的一列中引用复合键。是否有意义在deviceType和外键引用的数据中创建一个额外的列,或者将设备内的deviceID和deviceType分配给另一个id并引用内部数据更有意义吗?
提前致谢!
您有一个父表,列上有复合主键(deviceID, deviceType
)。如果要创建子表,则需要:
deviceID, deviceType
)考虑:
CREATE TABLE IF NOT EXISTS `data` (
`dataID` int(11) unsigned NOT NULL AUTO_INCREMENT,
`deviceID` int(11) unsigned NOT NULL,
`deviceType` int(10) unsigned NOT NULL,
`payload` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
PRIMARY KEY (`dataID`),
CONSTRAINT `fk_data_pk`
FOREIGN KEY (`deviceID`, `deviceType`)
REFERENCES `devices` (`deviceID`, `deviceType`)
ON DELETE CASCADE
);
注意:创建复合外键在功能上与创建两个外键不同,每个外键都指向父表中的一列。
在父表中给出此数据:
deviceID deviceType
1 0
2 1
如果在每列上创建一个单独的外键,它们将允许您在子表中插入记录,其值为(1, 1)
或(2, 0)
。复合外键将不允许它,因为源表中不存在这些特定元组。