외부 키 참조 복합 기본 키
데이터베이스는 하드웨어 디바이스와 수집된 데이터에 대한 정보를 저장합니다.사용 가능한 하드웨어 디바이스를 저장하는 디바이스 테이블을 만들었습니다.
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`)
)
디바이스ID는 실제 하드웨어 ID(1~12)에 대응합니다.하드웨어 디바이스에는 2종류가 있기 때문에 어떤 하드웨어 디바이스에 따라 0 또는 1이 되는 디바이스 타입을 작성하여 복합 프라이머리 키를 만드는 것이 적절하다고 생각했습니다.
나는 그 데이터를 저장하기 위해 다른 테이블을 만들었다.
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 및 외부 키 참조용 데이터 내부에 추가 열을 생성하여 디바이스를 할당하는 것이 더 합리적입니까?ID 및 deviceInside 디바이스를 다른 ID로 입력하고 해당 내부 데이터를 참조합니까?
잘 부탁드립니다!
컬럼에 복합 프라이머리 키가 있는 부모 테이블이 있습니다( )deviceID, deviceType
). 자 테이블을 작성하려면 다음 작업을 수행해야 합니다.
- 부모 테이블의 프라이머리 키의 일부인 각 컬럼에 대해 자녀 테이블에 1개의 컬럼을 만듭니다.(
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
);
NB: 복합 외부 키 생성은 상위 테이블의 열 중 하나를 가리키는 두 개의 외부 키를 생성하는 것과 기능이 다릅니다.
부모 테이블의 다음 데이터가 지정됩니다.
deviceID deviceType
1 0
2 1
각 열에 구분된 외부 키를 만들면 하위 테이블에 다음과 같은 값을 가진 레코드를 삽입할 수 있습니다.(1, 1)
, 또는(2, 0)
이러한 특정 튜플은 소스 테이블에 존재하지 않기 때문에 복합 외부 키에서는 허용되지 않습니다.
언급URL : https://stackoverflow.com/questions/55543308/foreign-key-reference-composite-primary-key
'programing' 카테고리의 다른 글
뷰에서 기능을 사용하는 방법 (0) | 2022.10.02 |
---|---|
판다의 특정 기둥 인덱스에 기둥을 삽입하는 방법은 무엇입니까? (0) | 2022.10.02 |
jQuery를 사용하여 "disabled" 속성을 제거하려면 어떻게 해야 합니까? (0) | 2022.10.02 |
JavaScript에서 파일 입력 요소에 대해 "클릭" 이벤트를 프로그래밍 방식으로 실행할 수 있습니까? (0) | 2022.10.02 |
MySQL 스왑 사용 및 최종 oom_killer의 원인 (0) | 2022.10.02 |